GiYeong

Java - 4 본문

CS/Java

Java - 4

gy2710 2022. 6. 10. 03:41

SOLID (객체지향 개발 5대 원리)

1. SRP (단일 책임의 원칙 : Single Responsibility Principle)

하나의 모듈(클래스)은 하나의 기능만 가지며, 모듈이 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어 있어야 한다.

 

2. OCP (개방 폐쇄 원칙 : Open-Cloces Principle)

확장에 대해 열려있고, 수정에 대해서는 닫혀있어야 한다.

즉, 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있어야 하고, 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있어야 한다.

 

3. ISP (인터페이스 분리 원칙 : Interface Segregation Principle)

클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.

즉, 어떤 클래스가 다른 클래스에 종속될 때, 가능한 최소한의 인터페이스만을 사용해야 한다.

 

ISP를 '하나의 일반적인 인터페이스보다는, 여러 개의 구체적인 인터페이스가 낫다'라고 정의할 수도 있다.

만약 어떤 클래스를 이용하는 클라이언트가 여러 개고, 이들이 해당 클래스의 특정 부분 집합만을 이용한다면, 이들을 따로 인터페이스로 빼서 사용한다. 

 

SRP가 클래스의 단일 책임을 강조한다면, ISP는 인터페이스의 단일 책임을 강조한다.

 

4. LSP (리스코프 치원 원칙 : Liskov Substitution Principle)

하위 타입은 상위 타입을 대체할 수 있어야 한다.

즉, 해당 객체를 사용하는 클라이언트는 상위 타입이 하위 타입으로 변경되어도 차이가 없어야 한다.

 

5. DIP (의존 역전 원칙 : Dependency Inversion Principle, DIP)

고수준 모듈(변경이 없는 추상화된 클래스 또는 인터페이스)은 저수준 모듈(변하기 쉬운 클래스)의 구현에 의존해서는 안되며, 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.

즉, 추상화에 의존하며 구체화에는 의존하지 않는 설계 원칙을 의미한다.

 

동일성(Identity)과 동등성(Equality)

동일성

동일하다는 뜻으로, 두 개의 객체가 완전히 같은 경우를 의미한다.

즉, 주소 값이 같다는 의미이다.

refVar2와 refVar3는 동일한 객체를 가리키고 있으므로, 두 변수는 동일하다고 할 수 있다.

또한 해당 변수가 동일한지는 '==' 연산자를 통해 판별할 수 있다.

 

동등성

동등하다는 뜻으로, 두 개의 객체가 같은 정보를 가지고 있는 경우를 의미한다.

즉, 참조하고있는 주소 값이 서로 다르더라도 내용이 같으면, 두 객체는 동등하다고 할 수 있다.

String str1 = new String("aaa");
String str2 = new String("aaa");

System.out.println(str1 == str2);
System.out.println(str1.equals(str2));

str1과 str2가 참조하는 객체의 주소 값은 다르지만, 내용이 같기 때문에 두 변수는 동등하다고 할 수 있다.

이와 같이 해당 변수가 동등한지는 'equals' 연산자를 통해 판별할 수 있다.

 

동일하면 동등하지만, 동등하다고 동일한 것은 아니다.

 

원시 타입과 참조 타입

원시 타입(Primitive Type)

정수, 실수, 문자, 논리 리터럴 등의 실제 데이터 값을 저장하는 타입 (boolean, char, byte, short, int, long, float, double)

 

참조 타입(Reference Type)

원시 타입을 제외한 타입들 (문자열, 배열, 열거, 클래스, 인터페이스)

즉, 객체의 주소를 저장하는 타입

Java에서 실제 객체는 Heap 영역에 저장되며, 참조타입 변수는 Stack 영역에 실제 객체들의 주소를 저장하여 객체를 사용할 때마다 참조 변수에 저장된 객체의 주소를 불러와 사용하는 방식이다.

 

차이점

1. 원시 타입은 null을 담을 수 없지만, 참조 타입은 가능하다.

// 불가능
int i = null;

// 가능
Integer integer = null;

2. 원시 타입은 제네릭 타입에서 사용할 수 없지만, 참조 타입은 가능하다.

// 불가능
List<i> list;

// 가능
List<Integer> list;

3. 원시 타입이 참조 타입에 비해 접근 속도가 빠르고, 메모리를 적게 사용한다.

 

String, StringBuilder, StringBuffer

String

String 객체는 한번 값이 할당되면, 해당 공간은 변하지 않는다.

이를 불변(Immutable)성이라고 한다.

따라서, 변하지 않는 문자열을 자주 사용해야 할 경우, String 타입을 사용한다.

 

StringBuilder, StringBuffer

할당된 공간이 변할 수 있다.

이를 가변(mutable)성이라고 한다.

 

StringBuffer

동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작할 수 있다.

따라서 멀티 스레드 환경과 문자열의 추가, 수정, 삭제 등이 빈번하게 발생하는 경우, StringBuffer을 사용한다.

 

StringBuilder

동기화를 지원하지 않지만, StringBuffer보다 성능이 좋다.

따라서 단일 스레트 환경과 문자열의 추가, 수정, 삭제 등이 빈번하게 발생하는 경우, StringBuilder를 사용한다.

 

Checked Exception, Unchecked Exception

Runtime Exception을 상속하지 않는 클래스는 Checked Exception, 상속한 클래스는 Unchecked Exception으로 분류할 수 있다. Runtime Exception을 상속한 클래스는 명시적으로 예외 처리를 하지 않아도 된다.즉, Checked Exception은 예외에 대한 대처 코드가 없으면 컴파일이 진행되지 않지만, Unchecked Exception은 예외에 대한 대처 코드가 없더라도 컴파일이 진행된다.

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

Java - 6  (0) 2022.06.13
Java - 5  (0) 2022.06.11
Java - 3  (0) 2022.06.08
Java - 2  (0) 2022.06.07
Java - 1  (0) 2022.06.07
Comments