JUST GO
[공통] Java 본문
Java
1. 언어적 특성
- 자바는(Java)는 운영체제(OS, Operating System) 중립적 언어로, JRE(Java Runtime Environment)가 지원되는 모든 언어에서 동일하게 작동한다. 이를 가능하게 해주는 환경을 JVM(Java Virtual Machine)이라 한다.
- 자바 언어를 이용하여 개발하기 위해 사용하는 SDK(Software Development kit)은 JDK(Java Development kit)이고, JDK는 JRE를 포함하고 있다.
- 즉, 결론적으로 자바 프로그램을 실행만 하면 되는 환경이라면 JRE를, 개발도 해야하는 환경이라면 JDK를 설치하면 된다.
2. 시작점
- 모든 프로그램은 실행 시의 시작점이 필요한데, 자바에서는 main 메서드(Method)가 그 역할을 한다.
- main 메서드는 정적(Static)이어야 하고 매개변수로 문자열(String) 배열을 하나 받는다.
- JDK 설치
3. 주석
- 여느 언어와 같이 주석(Comment)은 컴파일 및 실행에 영향을 미치지 않으며 길든 짧든 없든 있든 성능에 영향을 미치지 않는다.
- 중요하거나 복잡한 부분, 혹은 클래스나 메서드에 설명을 남겨놓는 습관을 들이는 것이 좋다.
- 한 줄 주석은 // 로 사용한다.
- 여러줄 주석은 /* .... */ 방식으로 사용한다.
4. 접근 제한자(Access Modifier)
- 접근 제한자는 어떠한 대상(클래스, 인터페이스, 열거형, 메서드, 멤버 변수 등)에 대한 (외부의) 접근을 제한하기 위해 사용한다.
- public : 해당 대상에 접근하는데 제한이 없음.
- protected : 동일한 패키지 경로 혹은 상속 관계에서만 접근할 수 있음.
- (default) : 동일한 패키지 경로에서만 접근할 수 있음.(실제로 default 라고 쓰면 안 되고 생략해야 한다.)
- private : 동일한 클래스 내에서만 접근할 수 있음.
5. 패키지(Package)
- 어떠한 대상들을 종류별/목적별로 구분하기 위해 존재하는 것. 실제로 까보면 그냥 디렉토리(폴더)이다.
- 전 세계에 존재하는 수 많은 자바 프로젝트들 간의 의존성(Dependency) 관계에서 충돌하는 것을 막기 위해 패키지 경로의 시작은 소유한 도메인의 역순인 경우가 많다.
- 패키지 경로는 [도메인 네임의 역순].[프로젝트 Artifact ID(정체성)] 으로 지정하는 경우가 많다. 예로 들면 아래와 같음.
- '네이버 카페'의 경우 : com.naver.cafe
- '네이버 블로그'의 경우 : com.naver.blog
- 패키지 경로는 package 키워드를 이용하여 구성 요소의 가장 상단에 적혀있다.
- 어떠한 구성요소의 풀네임은 [패키지 경로].[구성요소의 이름] 으로, 흔히 사용하는 String의 풀네임은 java.lang.String 인데, 여기서 java.lang은 패키지 경로, String이 구성요소의 이름이다.
6. 정적(static) 및 비정적(Non-static)
- 정적인 것(주로 멤버)은 프로그램 실행과 동시에 객체화가 이루어 지거나 존재가 확인된다.
- 정적인 컨텍스트에서 비정적인 것에 바로 접근할 수 없으며, 객체화된 변수를 통하여 접근할 수 있다. 반대로, 비정적인 컨텍스트에서 정적인 것에 접근하는데에는 제한이 없다.(시간의 흐름에 대해 고려할 것)
- 정적인 것에 접근할 때에는 타입을 통해 접근한다.(System.out 처럼)
- 비정적인 것에 접근할 때에는 객체를 통해 접근한다.(out.println 처럼)
- 정적인 대상은 어느 관점에서 보든 동일한 대상이다.
7. 기타 개념
- 구문(Statement) : 실행 단위이다. 변수 및 상수 선언, 대입 연산 및 증감 연산을 하거나 메서드를 호출하는 등의 행위 하나를 구문이라 한다. 자바에서는 하나의 구문이 끝난 뒤에는 반드시 세미콜론(;)을 끝에 붙인다.
- GC(Garbage Collector) : 접근점이 소실된 변수나 상수를 메모리에서 제거(Free)한다.
- 오버플로우(Overflow) : 기초 타입에서 발생하며 어떤 타입이 가질 수 있는 최대 값 보다 1 더 큰 값 혹은 최소값 보다 1 더 작은 값을 대입할 경우 최대값이 최소값으로, 최소값이 최대값으로 변하는 현상이다. 가령 Integer.Max_VALUE + 1는 Integer.MIN_VALUE와 같다. 엄밀히 말하면 최소값에서 1을 빼면 최대값이 되는 것은 언더플로우(Underflow)이다.
- 리터럴(Literal) : 어떠한 값을 사용할 때 변수나 상수가 아닌, 직접 적은 모든 값을 리터럴이라 한다. 리터럴 연산시 형변환은 기초타입(+ 문자열)에서 보다 규모가 큰 것으로 변하게 된다.
- float 타입의 경우 리터럴 뒤에 F를 붙여야 한다. 가령, float pi = 3.14F;
- double 타입의 경우 리터럴 뒤에 D를 붙이는게 좋다. 가령 double pi = 3.14D;
- long 타입의 경우 리터럴 뒤에 L을 붙여야 한다. 가령 long l = 33333L;
- int, byte, boolean, char 타입의 경우 서픽스(Suffix)가 따로 없다.
- 이는 모든 정수형 리터럴을 서픽스없이 적게 되면 int로 인식되기 때문이다.
- short 및 byte 를 적기 위해서는 강제 형변환이 필수적이다. 가령, byte b = (byte) 10;
- boolean 은 사실 true 혹은 false 뿐이고, char 는 홑따옴표라는 특수기호를 사용함으로 서픽스가 있을리가...
- 의존성(Dependency) : 직접 개발하기 난해하고(필요성이 떨어지고), 사용하고자 하는 기능이 대체적으로 공통적인(가령 JSON) 것들에 대해 (공인된) 개발자 (혹은 팀)가 개발해 놓은 외부 프로젝트를 가져와서 사용하는 것 혹은 그러한 성질.
- 의존성 관리자(Dependency Manager) : 현재 개발 중인 프로젝트에 외부 의존성을 주입하거나 제거하는 등의 관리 체계를 제공하는 것. 대표적으로 메이븐(Maven)과 그래들(Gradle)이 있다. 그 외 종류도 많은데 의존성 관리자가 하는 일은 모두 동일하며 다만 작성하는 방식이 서로 조금씩 다를 뿐.
- 유틸리티 클래스(Utility Class) : ~Utils 의 명명법을 (주로) 가진다. 객체화를 못하도록 막는 것이 일반적이며, 이는 정적이고 상수인 멤버나, 정적인 메서드만 가진다. 주로 자주 사용하는 코드를 서로 관련있는 것들 끼리 묶어내는 역할을 한다.