Java-맛보기-1

세상에 자바라니


객체지향을 강요하고, 가비지 콜렉터로 메모리도 많이먹고, (알고리즘 문제를 풀 때) 속도가 느려서 시간 제한도 더 주는 자바를 왜 쓰지??
차라리 파이썬을 쓰지

이러한 생각을 가지고 사용해보고 싶은 언어에서 가장 뒤에 미뤄뒀는데,
내가 정말 객체지향을 싫어하고, 가비지 콜렉터를 싫어하는게 맞나?
이런 고민을 정말 많이 했지만,
아직 모르는게 너무 많아서 맛보기 전에는 모르겠다는 생각이 들었다.
일단 맛을 보고 골라야겠다! 고고~

위키피디아의 자바의 역사, 철학에서 “Write Once, Run Anywhere”부분이 마음에 들었던 것 같다.

자바는 어떻게 돌아가지?


C/C++ 같은 컴파일 언어는 컴파일러에 의해서 기계어로 번역이 된다.
CPU가 달라지면, 사용할 수 있는 명령어가 달라지기 때문에, 다시 컴파일을 해야한다.
하지만, Java는 한번만 컴파일을 해서 JVM이 있는 곳 어디든 실행이 가능하다.
Java는 JVM(가상머신) 위에서 돌아가는데, .java 파일을 컴파일하게 되면, .class 바이트코드로 (JVM이 이해할 수 있는 기계어) 번역되고, JVM이 인터프리터가 되어서 CPU에 맞는 기계어로 실행이 된다. Java 컴파일 과정 (출처 : 점프 투 자바)

java 기본적인 구조 탐색 (+ 접근제한자)


  1. jdk 설치 (LTS버전인 17로 설치)
  2. 개발환경 세팅(vs code <- Extension pack for java)

일단 자바 파일을 만들게 되면, 기본적인 형태는 아래와 같다.

[public] class 클래스명 {
    [public|private|protected] [static] (자료형) 멤버변수명;
    [public|private|protected] [static] (리턴자료형|void) 메소드명(입력자료형 매개변수, ...) {
        명령문(statement);
        ...
    }
    ...
}
...
  1. 파일 하나에는 하나의 퍼블릭 클래스가 올 수 있고, 그 이름은 파일의 이름과 같아야 함.
  2. 다른 파일에서는 퍼블릭 클래스로만 접근이 가능.

메소드가 무엇인가? class 내부에 있는 함수를 말한다.

접근 제어자에는 private, default, protected, public가 있다.

  • private : 자기 자신에서만 접근 가능
  • default : (기본값) 같은 패키지 내에서 접근 가능
  • protected : 같은 패키지 또는 하위의 패키지의 클래스 중 상속받은 클래스에서만 접근 가능
  • public : 어디에서든 접근 가능(한 문!

어디로든 문

package, import


package car;
// 또는 package car.hyundai; 등 

import somepackage;
import somepackage.childpackage;

패키지는 비슷한 성격의 자바 클래스들을 모아놓기 위한 폴더와 같은 개념이다.
여러 사람들이 개발할 때, c++의 namespace처럼 패키지를 이용해서 충돌이 발생하지 않도록 할 수 있다.

이렇게 작성된 클래스들의 묶음인 패키지를 import를 통해서 불러올 수 있고, 패키지 내부의 public 클래스들을 사용할 수 있다.

primitive types (원시 자료형)

자바에는 총 8개의 primitive type들이 존재한다.
boolean, byte, short, char, int, long, float, double
이 자료형들은 모두 소문자로 시작한다. (대문자로 시작하는 것은 Wrapper class임)
primitive types의 경우에는 new 키워드를 사용할 수 없고, literal값으로만 대입이 가능하다.
또한 call by value형태의 원본 값의 복사만 가능하기 때문에, 인자로 직접 원시 타입의 값을 넘겨주는 경우, 원본의 변경이 불가능하다.

다른 언어에 비해 특별한 부분은 타입에 대해서 민감하다는 부분이다.

boolean

true / false 만 대입 가능하다.
다른 언어에서 처럼 1과 0등 다른 값을 대입할 수 없다.

non primitive types

Integer, Long, Double, Float, Boolean, Char과 같은 원시 타입에 대응되는 Wrapper 클래스가 존재하고, 이외에도 String, StringBuffer, Array, List(ArrayList, Vector, LinkedList, …), Map(HashMap, LinkedHashMap, TreeMap, …), Set(HashSet, TreeSet, LinkedHashSet, …) 등 여러가지 타입들이 존재한다.
이들은 call by reference로 전달이 되기 때문에 원본에 대해서 자유롭게 변경할 수 있다.

카테고리:

업데이트:

댓글남기기