📌객체 지향(OOP)의 4대 특성
- 캡슐화: 정보 은닉
- 상속: 재사용
- 추상화: 모델링
- 다형성: 사용 편의
💡추상화: 모델링
추상이란? 나에게 추상적이란 뜻은 구체적의 반대. 즉, 구체성이 없어서 무언가로 표현하기 어려운 것이라는 뜻으로 받아들였다. 나처럼 추상적이란 정의를 이런 뜻으로 받아들이고 있으면 추상화란 의미를 이해하기 힘들 것이다. 정의를 다시 살펴보도록 하겠다. 추상이란 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용이다. 여기서 공통되는 특성이나 속성 따위를 추출한다는 말에 주목을 하여야 한다. 왜 피카소의 그림을 추상화라 부르고 수학이 추상적인 학문이라 할까? 피카소의 추상화 경우, 눈에 보이는 그대로의 모습이 아닌 작가가 마음속에 느껴지는 그 사람의 특징을 극대화해서 추상화로 그린 것이기 때문이다. 또한 수학이 추상적인 학문인 이유는 실제하진 않지만 일상적인 개념들을 일반화하고 공통점을 찾아내서 정리하였기 때문에 추상적인 학문이라 하는 것이다.
즉, 추상화란 구체적인 것을 분해해서 관찰자가 원하는 특성이나 속성만 갖고 재조합하는 것이다. 이를 객체 지향의 추상화와 연관시켜 설명해보도록 하겠다.
클래스와 객체를 생각해보자. 객체와 클래스에 대해 누구나 한 번쯤은 들었을 것이므로 예시를 들어 간단히 설명하고 넘어가도록 하겠다.
사람 아이유 = new 사람();
사람 비아이 = new 사람();
사람 이문세 = new 사람();
위 예제코드를 살펴보면 클래스는 '사람'이고 객체는 '아이유'이다. 또한 밑에 코드들도 마저 보면 클래스는 '사람'인데 객체는 '비아이', '이문세'이다. 사람이라는 클래스를 이용해 하나의 사람을 만들고 '아이유', '비아이', 이문세'이라는 이름을 지어준 것이다.
'아담', '우영우', '박은빈'이라는 객체를 만드는 클래스를 작성하기 위해서는 만들고자 하는 객체들의 공통된 특성들을 설계하여야 한다.
사람이라는 클래스를 설계한다 생각하고 공통된 특성을 생각해보자. 키, 몸무게, 성별, 혈액형, MBTI, 직업 같이 명사로 표현되는 속성을 생각할 수 있고, 먹다, 자다, 싸다, 본다, 노래하다, 춤추다 라는 동사로 표현되는 메소드를 생각할 수 있다. 하지만 막연하게 사람에 대한 특성을 모두 나열해 생각해본다면, 끝도 없이 나열해야 할 것이다. 이때 내가 어떤 관점으로 볼 것인가 혹은 어떤 목적으로 만들 것인가를 생각하여야 한다. 만약 가수 관점에서 바라본다면 사람이란 클래스 이름 대신 가수를 의미하는 좀 더 구체적인 이름으로 바꿀 수 있을 것이고 다른 쓸데없는 특성들은 버리고 '노래하다', '춤추다' 같은 메소드 같이 가수를 특징하도록 클래스 설계도 달라질 것이다.
즉, 추상화란 구체적인 것을 분해해서 관심있는 특성만 가지고 재조합하는 것이라 할 수 있다. 따라서 추상화를 한 마디로 표현하자면 '객체 지향의 4대 특성 중 추상화는 모델링이다'라고 할 수 있다.
💡상속: 확장
상속에 관해 설명하기 앞서 한 가지 설명을 하도록 하겠다. 상속을 배울 때 하위 클래스는 상위 클래스를 상속한다고만 정의를 배운다. 이것도 맞는 말이지만 정확히 말하면 상위 클래스를 상속하는 것이 아니라 상위 클래스의 특성을 상속하는 것이다. 따라서 하위 클래스는 상위 클래스의 특성을 상속하면서 거기에 더해 필요한 특성이 추가되기 때문에 객체 지향에서의 상속은 상속이란 용어보다 확장이란 용어를 사용하는 것이 개념을 이해하는데 더 적합할 것이다.
따라서 하위 클래스는 상위 클래스를 확장한 것이기 때문에 '하위 클래스는 상위 클래스다'라고 말할 수 있다. 이는 객체 지향 설계 5대 원칙 중 하나인 LSP(리스코프 치환 원칙)를 나타내는 말이므로 관계를 기억하도록 하자.
다중 상속(extends)과 다중 구현(implements)
Java는 다중 상속을 지원하지 않는다는 것을 알 것이다. 다중 상속을 지원하는 C++를 계승/발전/단순화한 Java가 다중 상속을 빼버린 이유는 무엇일까? 하나의 클래스가 여러 상위 클래스를 상속 받게 되면 다이아몬드 문제가 발생할 수 있다. 다이아몬드 문제란 같은 이름의 메소드를 가진 여러 상위 클래스에서 상속을 받아서 해당 메소드를 실행했을 때 컴파일 에러가 발생하는 것을 말한다. 이와 같은 문제로 Java와 C#은 다중 상속을 지원하지 않는다. 대신 Java에서는 C++에는 없는 인터페이스를 도입하였다. (여러 인터페이스를 다중 구현(implements) 가능)
💡다형성: 사용 편의성
다형성을 공부할 때 오버라이딩(overriding)과 오버로딩(overloading) 용어를 많이 들어봤을 것이다.
- 오버라이딩(overriding)
같은 메소드 이름, 같은 인자 목록으로 상위 클래스의 메소드를 재정의하는 것 - 오버로딩(overloading)
같은 메소드 이름, 다른 인자 목록으로 다수의 메소드를 중복 정의하는 것
두 정수를 더해서 반환하는 함수 add(int, int)가 있다고해보자. 그런데 정수들의 합 뿐만 아니라 정수와 부동소수점수를 더해서 반환하는 함수가 필요해졌다. 만약 오버로딩이 지원되지 않는 언어라면 add라고 하는 함수명을 이미 사용했기에 이름과 인자 목록이 다른 형식의 함수(ex. addIntDouble(int , double))를 만들어줘야 한다. 다형성이 지원되지 않는 언어는 같은 이름의 함수를 추가로 만들 수 없기 때문이다. 여기에 사용자가 부동소수점 수를 먼저 입력받고 정수를 나중에 입력받는 함수도 원한다면 addDoubleInt(double, int) 형식의 함수를 또 만들어야 할 것이다.
즉, 오버로딩은 함수명 하나를 가지고 인자 목록만 달리하면 위와 같은 경우를 해결할 수 있으니 매우 편리해질 것이다. 특히 Java에서 제네릭(Generic)을 이용하면 하나의 함수만 구현해도 다수의 함수를 구현한 효과를 낼 수 있다. 다형성은 사용 편의성이라는 말은 이 때문이다.
💡캡슐화: 정보 은닉
정보 은닉이라 하면 접근 제어자부터 생각날 것이다.(public, protected, package, private)
- public
모두가 접근 가능하다. - protected
자신과 상속 관계에 있는 서브 클래스 접근 가능, 같은 패키지 내의 클래스에서 접근 가능하다. - [default]
같은 패키지 내의 클래스에서 접근 가능하다. - private
본인만 접근 가능하다.
'Java' 카테고리의 다른 글
[Java] 변수명, 메소드명 작성법 (0) | 2022.10.29 |
---|---|
[Java] SOLID: 객체 지향 설계 5원칙 (0) | 2022.07.23 |
[Java] 프로그램 메모리 저장 방식 (0) | 2022.07.22 |
[이클립스] Github(깃허브)에서 source(소스) clone(가져오기) (0) | 2022.07.08 |
[Java] JavaFX 이클립스에 세팅 (0) | 2022.06.07 |