[Java] 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)배열을 하나 받는다.
▶ : 실행가능 표시 > Run Main.main()~> 실행

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`, `short`, `byte`, `boolean`, `char` 타입의 경우 서픽스(Suffix)가 따로 없다.
            - `int`는 모든 정수형 리터럴을 서픽스없이 적게 되면 `int`로 인식되기 때문이다.
            - `short` 및 `byte`를 적기 위해서는 강제 형변환이 필수적이다. 가령, `byte b = (byte) 10`;
            - `boolean`은 사실 `true`혹은 `false` 뿐이고, `char`는 홑따옴표라는 특수기호를 사용함으로 서픽스가 있을리가...
    - 의존성(Dependency) : 직접 개발하기 난해하고(필요성이 떨어지고), 사용하고자 하는 기능이 대체적으로 공통적인(가령 JSON) 것들에 대해 (공인된) 개발자(혹은 팀)가 개발해 놓은 외부 프로젝트를 가져와서 사용하는 것 혹은 그러한 성질.
    - 의존성 관리자(Dependency Manager) : 현재 개발 중인 프로젝트에 외부 의존성을 주입하거나 제거하는 등의 관리 체계를 제공하는 것. 대표적으로 메이븐(Maven)과 그래들(Gradle)이 있다. 그 외 종류도 많은데 의존성 관리자가 하는 일은 모두 동일하며 다만 작성하는 방식이 서로 조금씩 다를 뿐.
    - 유틸리티 클래스(Utility Class) : `~Utils`의 명명법을 (주로) 가진다. 객체화를 못하도록 막는 것이 일반적이며, 이는 정적이고 상수인 멤버나, 정적인 메서드만 가진다. 주로 자주 사용하는 코드를 서로 관련있는 것들 끼리 묶어내는 역할을 한다.

'Back > Java' 카테고리의 다른 글

[Java] 일반 문법(반복문)  (0) 2023.02.08
[Java] 연산자와 순위  (0) 2023.02.08
[Java] 타입(Type) 그리고 변수와 상수  (0) 2023.02.07
[Java] 클래스(Class)  (0) 2023.02.07
[Java] 공통  (0) 2023.01.31