SOLID(객체지향 5대원칙)에 대해서 설명해주세요.
- SRP(Single Responsibility Principle) : 단일 책임 원칙클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 함.
- OCP(Open-Closed Principle) : 개방-폐쇄 원칙확장에는 열려 있어야 하고 변경에는 닫혀 있어야 함.
- LSP(Liskov Substitution Principle) : 리스코프 치환 원칙상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 함.
- ISP(Interface Segregation Principle) : 인터페이스 분리 원칙인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 함.
- DIP(Dependency Inversion Principle) : 의존 역전 원칙고수준 모듈은 저수준 모듈의 구현에 의존해서는 안됨.
동일성(identity)와 동등성(equality)에 대해 설명해주세요. (equals(), ==)
동일성(identity)
동일성은 동일하다는 뜻으로 두 개의 객체가 완전히 같은 경우를 의미한다. 여기서 완전히 같다는 뜻은 두 객체가 사실상 하나의 객체로 봐도 무방하며, 주소 값이 같기 때문에 두 변수가 같은 객체를 가리키게 된다.
위 예제에서 refVar1은 객체1을 가리키고 있고, refVar2와 refVar3는 객체2를 가리키고 있다. refvar2와 refVar3는 동일한 객체를 가리키고 있으므로, 두 변수는 동일하다고 이야기할 수 있다. 그리고 해당 변수가 동일한지 == 연산자를 통해 판별할 수 있다.
참고로 Primitive 타입은 객체가 아니라 주소가 없으므로 == 연산자를 사용하였을 때 내용이 같으면 동일하다고 말한다.
동등성(equality)
동등성은 동등하다는 뜻으로 두 개의 객체가 같은 정보를 갖고 있는 경우를 의미한다. 동등성은 변수가 참조하고 있는 객체의 주소가 서로 다르더라도 내용만 같으면 두 변수는 동등하다고 이야기할 수 있다. 동일하면 동등하지만, 동등하다고 동일한 것은 아니다. 그리고 해당 변수가 동등한지 equals 연산자를 통해 판별할 수 있다.
String str1 = new String("aaa");
String str2 = new String("aaa");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
new 키워드를 통해 다른 String 객체를 메모리에 할당하였으므로 str1과 str2가 가리키는 객체의 주소 값은 다르므로 동일하지 않다. 하지만 String이 재정의한 equals() 연산자에 의해 두 객체의 내용이 같으므로 동등하다고 할 수 있다.
원시타입과 참조타입의 차이에 대해 설명해주세요.
원시 타입
원시 타입은 정수, 실수, 논리 리터럴, 문자 등 실제 데이터 값을 저장하는 타입!
https://seokmimmmmmmmm.tistory.com/142
여기에 원시 타입 관련 표가 있음 ㅎㅎ
int a = 10; 와 같이 코드를 작성했다면 정수 값이 할당될 수 있는 a라는 이름의 메모리 공간이 JVM 스택 영역에 생성되고, 10이라는 값이 들어간다. 즉, 원시 타입은 메모리 공간의 실제 데이터 값이 저장되어 있다.
참조 타입
참조 타입은 기본 타입을 제외한 타입으로, 객체의 주소를 저장하는 타입이다. 문자열(String), 배열, 열거형 상수, 클래스, 인터페이스 등이 있다. Java에서 실제 객체는 JVM 힙 영역에 저장되며, 참조 타입 변수는 실제 객체의 주소를 JVM 스택 영역에 저장한다. 그리고 객체를 사용할 때마다 참조 변수에 저장된 객체의 주소를 불러와 사용하게 된다.
Person p = new Person(); 이라는 코드를 작성했다면 p라는 이름의 메모리 공간이 스택 영역에 생성되고, 생성된 p의 인스턴스는 힙 영역에 생성된다, 즉, 스택 영역에 생성된 참조 변수 p는 힙 영역에 생성된 p의 인스턴스 주소 값을 가지게 된다.
String, StringBuilder, StringBuffer 각각의 차이에 대해 설명해주세요.
- String
- immutable(불변)
- 객체를 한 번 할당할시 메모리 공간에 변동이 없습니다.(할당시 Heap String Pool영역에 생성되어 그 값을 계속 사용함)
- 동기화를 신경쓰지 않아도 됨.
- 엄청나게 많은 문자열을 선언 및 연산할 시 성능저하를 고려해야 함.
- StringBuffer
- mutable(가변)
- 각 메서드별로 Synchronized Keyword가 존재함.
- 멀티스레드 환경에서도 동기화를 지원함.(thread-safe)
- StringBuilder
- mutable(가변)
- 동기화를 지원하지 않음.
Checked Exception과 Unchecked Exception에 대해 설명해주세요.
CheckedException과 UnCheckedException의 차이
CheckedException | UncheckedException | |
처리 여부 | 반드시 예외를 처리 | 예외 처리를 강제하지 않음 |
확인 시점 | 컴파일 단계 | 실행(Runtime) 단계 |
예외 발생 시 트랜잭션 처리 | Roll-Back 하지 않음 | Roll-Back 함 |
예외 종류 | Runtime Exception을 제외한 모든 예외 | Runtime Exception 하위 예외 |