객체지향 프로그래밍 모델에서 제시하는 개념
- 객체(object)
- 클래스(class)
- 추상화(abstraction)
- 캡슐화(encapsulation)
- 상속(inheritance)
- 다형성(polymorphism)
- 연관(association)
- 집약(aggregation)
- 구성(composition)
객체(object)란 무엇인가?
- 객체는 객체지향 프로그래밍의 핵심 개념 중 하나이다.
- 객체는 실세계의 개체다.
- 객체는 상태(필드)와 동작(메서드)을 가진다.
- 객체는 클래스의 인스턴스를 나타낸다.
- 객체는 메모리에서 공간을 차지한다.
- 객체는 다른 객체와 소통할 수 있다.
클래스(class)란 무엇인가?
- 클래스는 객체지향 프로그래밍의 핵심 개념 중 하나이다.
- 클래스는 객체를 생성하기 위한 템플릿 또는 청사진이다.
- 클래스는 인스턴스화하기 전까지는 메모리의 힙 영역을 소모하지 않는다.
- 클래스는 여러 번 인스턴스화할 수 있다.
- 하나의 클래스는 하나의 작업만 한다.(단일 책임 원칙 때문에 SOLID 원칙에서 설명예정)
추상화(abstration)란 무엇인가?
- 추상화는 객체지향 프로그래밍의 핵심 개념 중 하나이다.
- 추상화는 사용자와 관련 있는 내용만 노출하고 나머지 세부 내용은 숨기는 개념이다.
- 추상화를 통해 사용자는 애플리케이션이 일을 수행하는 방법이 아니라
애플리케이션이 수행하는 일 자체에 집중할 수 있다.
캡슐화(encapsulation)란 무엇인가?
- 캡슐화는 객체지향 프로그래밍의 핵심 개념 중 하나이다.
- 캡슈화는 객체 상태가 외부로부터 숨겨진 상황에서 이 상태에 접근하는 일련의 공개메서드(public method)만 노출하는 기법이다.
- 캡슐화는 각 객체가 클래스 내에서 객체의 상태를 비공개(private)로 유지할 때 성립한다.
- 캡슐화는 정보 은닉 메커니즘이라고도 한다.
- 캡슐화는 느슨한 결함, 재사용성, 보안 및 테스트하기 쉬운 코드와 같은 여러가지 중요한 이점을 제공한다.
- 자바에서 캡슐화는 접근 제어자(public, private, protected)로 구현할 수 있다.
상속(inheritance)이란 무엇인가?
- 상속은 객체지향 프로그래밍의 핵심 개념 중 하나이다.
- 상속을 통해 다른 객체를 기반으로 하는 새로운 객체를 만들 수 있다.
- 상속은 객체가 다른 객체의 코드를 재사용할 수 있도록 허용하여 코드의 재사용성을 유지한다.
또한 각 객체만의 로직도 추가할 수 있다. - 상속은 IS-A 관계라고 하며 부모-자식 관계라고도 한다. (IS-A란 ~은 A이다 하고 똑같다)
- 자바에서 상속은 extends 키워드로 구현할 수 있다.
- 상속된 객체는 슈퍼클래스라고 하고, 슈퍼클래스를 상속받은 객체는 서브클래스라고한다.
- 자바에서 여러 개의 클래스를 상속할 수 없다.
여기서 의문이 들 수 있다. 왜 자바는 여러 개의 클래스를 상속할 수 없고 interface는 왜 여러개가 상속이 가능한가?
만약 클래스가 다중상속이 가능하다고 하면 같은 메서드가 존재하는 클래스 2개를 상속한다고 가정해보자.(물론 기능은 다를 수 있다)
그러면 자바는 어떤 클래스의 메서드를 상속받아하는 지 알 수가 없다.
인터페이스는 추상메서드만 존재하는 것이여서 다중 상속이 가능하다.
그리고 인터페이스는 클래스가 아니다.
요약하자면, 인터페이스는 구현된 메서드가 없기 때문에, 다중상속이 가능하다.
클래스나 추상 클래스는 이미 구현된 메서드가 존재하기 때문에 다중 상속이 불가능하다.
다형성(polymorphism)이란 무엇인가?
- 다형성은 객체지향 프로그래밍의 핵심 개념 중 하나이다.
- 다형성을 뜻하는 "polymorphism"이라는 단어는 그리스어로 "많은 형태" 라는 뜻이다.
- 다형성은 때에 따라 객체가 다르게 동작할 수 있도록 한다.
- 다형성은 (컴파일 타임 다형성이라고 하는) 메서드 오버로딩이나
IS-A관계의 경우(런타임 다형성이라고 하는) 메서드 오버라이딩을 통해 형성될 수 있다.
메서드 오버로딩(Method Overloading) = 컴파일 타임 다형성
여러개의 메서드가 동일한 이름을 가지고 있지만 매개변수가 다른 경우 컴파일러가 오버로드된 메서드 가운데 어떤 형식을 호출할 것인지 컴파일 시간에 식별할 수 있으므로 컴파일 타임 다형성이라고 한다.
예를 들어 Triangle(삼각형)이라는 클래스에는 서로 다른 매개변수를 가진 여러 개의 draw 메서드를 정의할 수 있다.
메서드 오버라이딩(Method Overriding) = 런타임 다형성 or 동적 메서드 디스패치
IS-A 관계가 있을 때 일반적으로 사용하는 방법이다.
보통 여러 가지 메서드를 포함하는 인터페이스 구현으로 시작하며, 각 클래스는 특화된 동작을 수행하기 위해 인터페이스에 있는 메서드를 오버라이드한다. 이때 다형성이 타입에 대한 혼란 없이 이 클래스들을 부모 인터페이스와 똑같이 사용할 수 있게한다. 런타임에 자바가 이러한 클래스를 구별할 수 있고 어느 클래스가 사용하는 지 알고 있기 때문에 가능한 일이다.
요약하자면, 여러가지의 클래스를 선언하고 다 같은 클래스를 상속 받아 같은 메서드를 실행했을 때 혼란 없이 똑같이 기능을 수행한다는 뜻이다.
연관(association)이란 무엇인가?
- 연관은 객체지향 프로그래밍의 핵심 개념 중 하나이다.
- 연관은 서로 독립적인 두 클래스 간의 관계를 의미한다.
- 연관은 소유자가 없다.
- 연관은 일대일, 일대다, 다대일, 다대다 관계가 될 수 있다.
예를 들어, Person(사람)과 Address(주소) 객체에는 양방향 다대다 관계가 있을 수 있다.
즉, 한 명의 사람은 여러개의 주소와 연관될 수 있으며 하나의 주소는 여러 사람에게 속할 수 있다.
그러나 사람은 주소 없이 존재할 수 있고 주소도 사람 없이 존재할 수 있다.
집약(aggregation)이란 무엇인가?
- 집약은 객체지향 프로그래밍의 핵심 개념 중 하나이다.
- 집약은 단방향 연관 관계의 특별한 경우이다.
- 집약은 HAS-A 관계를 나타낸다. (HAS-A 관계란 ~는 A를 가지고 있다 라는 뜻이다.)
- 집약 관계에 있는 두 객체는 자체 수명 주기를 가지며 객체 중 하나는 HAS-A 관계의 소유자이다.
자체 수명 주기를 갖는다는 것은 한 객체가 종료되어도 다른 객체에 영향을 미치지 않는다는 의미이다.
구성(composition)이란 무엇인가?
- 구성은 객체지향 프로그래밍의 핵심 개념 중 하나이다.
- 구성은 좀 더 제한적인 집약 관계이다.
- 구성은 단독으로 존재할 수 없는 객체를 포함하는 HAS-A 관계를 나타낸다.
- 구성은 코드 재사용성과 객체의 가시성 제어를 유지한다.
위 그림을 보면 위 3개의 개념이 연관되어있다라는 것을 알 수 있다.
코드 없이 핵심개념들만 정리를 해서 이해가 안되는 부분들도 많다.
하지만 공부를 하면서 더욱 자세하게 포스팅을 올릴 예정이다.
이 내용은 자바 코딩 인터뷰 완벽 가이드라는 책을 보면서 나와 있는 내용을 정리 한 것이다.
'Web > Spring' 카테고리의 다른 글
MVC 패턴이란? (0) | 2023.03.21 |
---|---|
Spring Container에 대해서 (0) | 2023.03.02 |
Spring Framework에 대해서 (0) | 2023.03.02 |