CS 공부 3일차! 역시 몰아서 쓰고 있지만.. 오늘은 Java의 기본 개념들에 대해서 정리해 보았습니다. 사진은 java 커피 사진
-
장점 : OOP로서 응집력을 강화하고 결합력을 약화시켜 유지보수가 용이합니다. JVM위에서 플랫폼에 의존하지 않고 실행 가능하며 멀티스레딩을 지원합니다.
-
단점 : 처리 속도가 느리며 예외처리가 불편합니다.
-
OOP
- 객체지향(Object-Oriented)이란
- 객체(Object)란 무엇인가
- 객체지향 프로그래밍과 절차지향 프로그래밍의 차이 : 필드와 메소드가 절차지향에서는 분리되어있지만 객체지향에서는 하나로 합쳐져있다.
- OOP의 4가지 특징 : 캡슐화, 상속, 다형성, 추상화
- OOP의 5대 원칙 (SOLID) : SRP(Single Resposibility Principle), OCP(Open-Closed Principle), LSP(Liskov Substitution Principle), ISP(Interface Segregation Principle), DIP(Dependency Inversion Principle)
-
getter, setter : 캡슐화를 지향하기 때문에 메소드를 통해 데이터에 접근하도록 하는데 이때 이용되는 메소드. 객체에 값이 할당될 때 기준에 맞춰 예외처리를 할 수 있으며 데이터를 보호할 수 있다는 장점이 있습니다.
-
Multi-Thread
- Runnable 인터페이스를 구현하거나 Thread를 상속받아서 구현할 수 있습니다. 멀티 스레드 환경에서 공유하는 자원이 있으면 오류가 발생할 수 있습니다. 이를 Collections의 synchronizedList와 같은 메소드를 활용하거나 synchronized, volatile 키워드를 객체에 붙이거나 Atomic Type의 변수를 사용하는 방식으로 동기화시켜 해결할 수 있습니다. 또한 wait과 notify 함수를 활용하여 critical section에 대한 접근을 제어할 수 있습니다.
- Singleton Pattern : 객체의 인스턴스가 오직 1개만 생성되는 패턴으로 메모리 낭비를 방지할 수 있고, 데이터 공유가 쉽지만 동시성 문제가 발생할 수 있습니다.
- Callable과 Runnable의 차이 : 둘다 Thread를 구현하기 위한 인터페이스로서 Runnable은 리턴값이 없고 Exception을 발생시키지 않지만 Callable은 리턴값이 존재하고 Exception을 발생시킴니다.
-
Java SE와 Java EE 애플리케이션 차이
- SE는 Standard Edition이고 EE는 Enterprise Edition으로서 EE가 SE위에서 동작하며 JPA나 Servlet같은 API들이 추가된 것입니다. Spring은 이러한 Java EE의 기능들을 선택하여 수용하고 있습니다.
-
Access Modifier
- public은 어떤 class에서도 접근 가능하고 protected는 같은 package 내의 class들과 protected class를 상속받은 class에서만 접근 가능하며 private은 다른 class에서 접근이 불가합니다. default로는 같은 package내의 class들에서만 접근이 가능합니다.
- Non-Static vs Static : static은 전역변수로 사용할 수 있고 non-static은 사용할 수 없습니다.
-
정적 바인딩 vs 동적 바인딩
- 바인딩은 변수나 메서드 등을 위치한 메모리로 연결해주는 것인데 정적 바인딩은 컴파일 시에 일어나고 동적 바인딩은 실행시간에 일어나서 프로그램이 실행될때 변합니다. private, final, static 키워드가 붙으면 정적으로 바인딩됩니다.
-
java의 메인 메서드가 왜 public static void main(String[] args)일까?
- public : 프로그램이 실행될 때, JVM에 의해 호출되어야 하므로
- static : 객체가 생성되기 전에 JVM에 의해 호출되어야 하므로
- void : 아무 값도 retrun하지 않기 때문에
- String[] args : java commend에 매개변수를 문자열 배열로 만들어 넘겨주므로
-
클래스, 객체, 인스턴스
- Class가 붕어빵틀이면 객체는 붕어빵입니다.
- 객체를 클래스의 인스턴스라고 부르기도 합니다.
- 객체는 현실세계에 가깝고 인스턴스는 sw세계에 가깝습니다.
- 인터페이스와 추상 클래스의 차이 : Abstract Class는 다중 상속이 불가능하고 Interface는 다중 구현이 가능합니다. 또한 Interface에서 선언된 메소드는 implements한 class에서 모두 override해야하지만 abstract class는 모두 구현할 필요는 없습니다.
- Constructor : 인스턴스를 생성하기 위한 메소드입니다. 클래스와 이름이 같으며 명시적으로 생성해주지 않아도 파라미터가 없는 생성자가 default로 존재하며 파라미터를 추가함으로써 오버로딩이 가능합니다.
- Overriding vs Overloading : overriding은 상속받는 메소드를 재정의하는 것이고 overloading은 파라미터가 다른 메소드들마다 다르게 호출받게 하는 기술입니다.
-
에러 vs 예외
- 둘다 throawable 클래스를 상속받으며 에러는 stack overflow같이 복구할 수 없는 심각한 문제이고 예외는 예외처리를 통해 방지할 수 있습니다.
- try,catch,finally vs throws : throws는 예외가 발생한 메소드를 호출한 상위 메소드에 예외를 던지는 것입니다. try는 예외가 발생할 수 있는 코드를 넣고 catch는 예외 발생시 예외처리를 할 코드를 넣습니다. finally는 try와 catch가 종료된 이후에 실행됩니다.
- final/finally/finalize : final 필드는 최종적이라는 의미로 오버라이딩 되지 못하거나 상속받을 수 없게 됩니다. finally는 try문이 종료된 이후에 실행되는 코드가 들어가는 부분입니다. finalize는 GC가 실행될 때 호출되는 함수입니다. OOME가 발생할 수 있어서 Java 9 부터는 사용할 수 없습니다.
-
Framework vs Library
- Framework는 스스로 전체적인 흐름을 제어하며 사용자가 거기에 코드를 끼워맞추는 것이고 library는 사용자가 흐름을 제어하며 필요할때 가져다 쓰는 것입니다.
-
익명함수
- 리터럴 방식으로 만든 재사용하지 않을 이름없는 함수
-
Record
- class 선언시에 변수만 선언해두면 필드를 private final로 선언해주고 constructor와 getter, equals, hashCode, toString등을 자동으로 생성해준다. Java 14부터 도입되었다.