티스토리 뷰
출처: https://dev-coco.tistory.com/153
JAVA의 특징
- 객체지향 프로그래밍 언어로 캡슐, 상속, 다형성과 같은 객체 지향 개념의 특징이 잘 적용되어 있는 언어
- 객체지향 프로그래밍: 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만듦
- 기본 자료형을 제외한 모든 요소들을 객체로 표현
- 장점: JVM위에서 동작하므로 OS에 독립적, GC를 통해 자동적으로 메모리 관리 가능
- 단점: JVM위에서 동작하므로 실행 속도가 상대적으로 느림, 다중 상속이나 타입에 엄격
JVM의 역할
- JVM은 스택 기반으로 동작하고, Java Byte Code를 OS에 맞게 해석해주는 역할로 자동으로 메모리 관리
Java의 컴파일 과정
- .java 파일을 생성 => build => javac의 명령어를 통해 .class를 생성 => Class Loader를 통해 JVM 메모리 내로 로드 => 실행엔진을 통해 기계어로 번역
오버라이딩과 오버로딩
- 오버라이딩: 상위 클래스에 있는 메소드를 하위 클래스에서 재정의 할 수 있는 방식
- 오버로딩: 매개변수의 개수의 타입을 다르게 하여 같은 이름의 메소드를 여러 개 정의하여 사용할 수 있는 방식
불변 객체
- final: 불변객체는 한 번만 할당 가능하다는 선언으로 재할당 시 컴파일 오류가 발생하여 바로 확인이 가능
- 장점
- 값에 대한 검증 없이 로직 구현에 집중할 수 있다.
- 서비스 안정성이 높아진다. (버그 발생 가능성이 줄어듦)
- 스레드 동기화 문제를 방지할 수 있다.
추상 클래스와 인터페이스
- 추상 클래스: 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우
- 인터페이스: 모든 메소드가 추상 메소드로만 이루어져 있는 것
- 공통점: new 연산자로 인스턴스 생성 불가능, 사용을 위해서 하위 클래스에서 확장 및 구현을 해야 한다.
- 차이점: 인터페이스는 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제하고, 추상클래스는 상속받는 클래스들의 공통적인 로직을 추상화시키고 기능 확장을 위해 사용한다. 인터페이스는 다중 상속이 가능
객체지향 설계원칙
- SRP: 한 클래스는 하나의 책임만 가져야 한다.
- OCP: 확장에는 열려있고, 수정에는 닫혀있어야 한다.
- LSP: 상위 타입은 항상 하위 타입으로 대체할 수 있어야 한다.
- ISP: 인터페이스 내에 메소드는 최소한 일수록 좋다.
- DIP: 구체적인 클래스보다 상위 클래스, 인터페이스, 추상클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계 맺기.
자바의 메모리 영역
- Method: 전역변수와 static변수를 저장하며 프로그램의 시작부터 종료까지 메모리에 남아있다.
- Stack: 지역변수와 매개변수 데이터 값이 저장되는 공간으로 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다. 변수에 새로운 데이터가 할당되면 이전의 데이터는 지워진다.
- Heap: new 키워드로 생성되는 객체, 배열 등이 저장되며 GC에 의해 메모리가 관리되어진다.
생성자
- 클래스와 같은 이름의 메소드로 객체가 생성될 때 호출되는 메소드
- 기본으로 만들어지며 생성자는 파라미터를 다르게 하여 오버로딩 할 수 있다.
Synchronized
- 여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터를 접근할 수 없게 막는 개념
- 멀티 쓰레드 환경에서 쓰레드간 동기화를 시켜 데이터의 thread-safe를 보장
- 변수와 메소드에 사용해서 동기화 할 수 있고 이 키워드를 남발하게 되면 오히려 프로그램 성능 저하를 일으킴
new String() / " "
- new String()은 연산자로 새로운 객체를 생성하여 Heap 영역에 저장되고, " "은 Heap 안에 있는 String Constant Pool에 저장된다.
String Buffer, String Builder
- String은 불변 속성, StringBuffer와 StringBuilder는 가변 속성
- StringBuffer는 동기화를 지원하여 멀티 쓰레드 환경에서 주로 사용
- StringBuilder는 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용
String 객체가 불변인 이유
- 캐싱 기능에 의한 메모리 절약과 속도 향상: String 객체들은 Heap의 String Pool이라는 공간에 저장되는데 참조하려는 문자열이 이 영역에 존재하는 경우 새로 생성하지 않고 있는 객체를 사용하므로 상당한 성능 향상 기대
- thread-safe: String 객체는 불변이기 때문에 여러 쓰레드에서 동시에 특정 String 객체를 참조하더라도 안전
- 보안기능: 중요한 데이터를 문자열로 다루는 경우 해당 참조에 대한 문자열 값 변경 불가능
접근 제한자
- 변수 또는 메소드의 접근 범위를 설정해주기 위한 Java의 예약어
- public: 접근 제한이 없음
- protected: 해당 패키지 내 다른 패키지에서 상속받아 자손 클래스에서 접근 가능
- default: 해당 패키지 내에서만 접근 가능
- private: 해당 클래스에서만 접근 가능
리플렉션
- 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API
Error와 Exception
- Error: 실행 중 일어날 수 있는 치명적 오류로 컴파일 시점에 체크할 수 없고 프로그램은 비정상 종료된다.
- Exception: 비교적 경미한 오류이며 try-catch를 이용해 프로그램의 비정상 종료를 막을 수 있다.
Generic
- 데이터 타입을 하나로 지정하지 않고 사용할 때마다 범용적이고 포괄적으로 지정한다는 의미
- 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있어 에러를 사전 방지