[Java] - 객체지향

링딩·2023년 4월 3일
0

Computer Science

목록 보기
21/49




1. 객체지향이 나오게 된 배경


등장배경_ feat( 순차적, 절차적 프로그래밍..)

처음엔 '순차적 프로그래밍'을 썼다,, 그러나 순차적 프로그래밍은 순서대로 동작을 추가하며 프로그램을 완성하는 방식으로... 간단한 프로그램일 때는 괜찮았겠지만...
조금이라도 프로그램의 규모가 커지게 되면 코드의 동작이 순서대로에서 위로 갔다가 아래로 갔다가 동작이 직관적이지 못하게 되는 문제가 발생하였다.. 그래서

절차적(구조적) 프로그래밍이 등장하였다고 한다...


.
.
.

절차적 (구조적) 프로그래밍?

◽ 개념

절차적 프로그래밍에서 '절차'는 함수를 의미한다. 따라서 절차적 프로그래밍이란, 반복되는 동작을 함수 및 프로시저(리턴값이 없는 함수) 형태모듈화하여 사용하는 방식


이렇게 모듈화를 하면 반복동작을 줄일 수 있어 좋은 점도 있지만, 이 '프로시저'라는 개념 자체가 굉장히 추상적이라는 단점이 있었다.

haero_kim님의 예시를 빌리면

도서관의 도서 관리 프로그램을 개발한다고 하자.

  • 필요
    • '책'이라는 자료형을 구현해야 함
    • 책에 대한 함수를 구현해야 함

그러나, 구조적 프로그래밍에서는 이 둘을 따로 생각할 수 밖에 없다.
책은 책이고 책에 관한 함수는 따로 있기 때문에, 같은 소스코드 파일 내에 있더라도 이 둘의 연관 여부는 단 번에 알아차리기 어렵다.

즉, 논리적으로 묶여있을 수 없는 구조이기 때문에 동작이 추상적인 것이다.




⭐ 객체지향 프로그래밍의 등장

◽ 개념

  • 가능한 모든 물리적, 논리적 요소를 객체로 만드는 것이 객체지향 프로그래밍이다.
    -> 어떤 개념에 대하여 자료형과 함수 이 모두를 '객체'로 함께 묶어서 관리하기 위해서 등장

◾ 장점

  • 객체 간의 독립성이 뚜렷해짐
  • 중복된 코드의 양이 줄어듦
  • 유지보수 용이







2. 객체지향의 4가지 특징



1. 추상화 (Abstraction)

◽ 개념

  • 객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해내는 작업

ex) '부자들이 타는 차'를 추상화 집합으로 두면
이런 공통적인 특징을 만들어 활용하면 된다.

  1. 배기음이 시끄럽다 2. 비싸다 등등

이렇게 추상화로 구현해두면 다른 코드는 건드리지 않고 그 외의 추가적으로 만들 부분만 새로 만들면 된다.



2. 캡슐화 (Encapsulation)

◽ 개념

정보 은닉화를 통해... 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계하는 것

한 곳에서 변화가 일어나도 다른 곳에 영향이 덜하도록.
즉, 객체 내부의 어떤 동작에 대한 구현이 어떻게 되어 있는지를 감추는 것이다.(은닉화)

=> 그렇게 되면 외부에서 잘못 건드려 객체를 손상시키는 일을 방지할 수 있다.

'은닉화'를 통해
=> 객체 각각 독립적으로 작용할 수 있어야 하며(응집도 강함), 다른 모듈을 참조하는 결합도는 낮아야 한다.(결합도 낮음)



3. 상속 (일반화)

◽ 개념

여러 개체들이 지닌 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립하는 과정 (일반화라고도 함)

누구든 상속의 개념은 알고 있을 것이다.
자식 클래스가 부모 클래스의 필드나 메소드를 그대로 물려받아 사용할 수 있게, 혹은 조금 다듬어서 사용할 수 있게 해주는 것이다.
=> 조금 더 엄밀히 따지면 '상속'은... 자식 클래스를 외부로부터 은닉하는 '캡슐화'의 일종이다.

(핵심) 외부로부터 은.닉.하여 개별적인거처럼 진행되어야 한다는 것~!


◽ 장점

상위 클래스를 재사용 한다는 것. 다시 활용한다는 것이 좋기도 하겠지만 단점도 확실하다.
그렇기에 '객체지향 프로그래밍'에서 코드 재사용을 목적으로 하는 상속 행위를 금한다.


🤷‍♂️ 왜...? 코드 재사용을 목적으로 쓰면 안되는 것인가?

  1. 부모 클래스의 변경이 불편해짐
    -> 부모 클래스에 의존한다는 것은 즉, 부모가 변경되면 영향을 그대로 받을 것

  2. 불필요한 클래스가 많아짐

  3. 잘못된 상속 사용
    -> 같은 종류가 아닌 클래스의 구현을 재사용하고자 상속하는 경우 문제가 발생할 수 있다.
    => 상속받고자 하는 클래스가 부모 클래스와 IS-A 관계가 ❌ 때 발생함.


그러면 상속을 자제하라는건데 잘못된 상속 사용과 같은 문제들은 어떻게 해결하라는걸까?😥😥

A. 좀 더 복잡하고 구현이 어려우나, 구성을 통해 해결해보자.
=> 객체 구성은 객체 내부 필드에서 다른 객체를 참조하는 방식 으로 구현하는 것이다.

  • Q. 이러면 뭐가 좋은가?
    A. 복잡은 하지만, 변경할 때 유연성이 확보된다.

정말 해로님의 말씀이 좋아 그대로 가져왔다.

상속은 반드시

  1. IS-A 관계 성립할 때
  2. 재사용 관점 X, 기능의 확장 관점 O

이러한 상황에서만 사용해야 한다. 상속을 코드 재사용의 개념으로 이해하면 안 된다. 코드를 재사용할 수 있다고 무지성으로 상속을 사용하는 경우가 있는데, 이렇게 되면 클래스간 결합도가 너무 높아져 유지보수 효율이 똥망한다.
그러니 일반적인 개념을 구체화하는 상황에서 상속을 사용하자.


+)알게 된 개념

IS-A
말 그대로 포함 관계를 의미한다. 한 클래스 A 가 다른 클래스 B 의 자식 클래스임을 이야기한다.
e.g. 햄스터는 동물이다. (소의 부모 클래스는 동물)



4. 다형성 (Polymorphism)

◽ 개념

서로 다른 클래스의 객체가 같은 동작 수행 명령을 받았을 때, 각.자.의 특성에 맞는 방식으로 동작하는 것

ex) 오버로딩, 오버라이딩

예시로 동물 이라는 개념을 일반화(상속)하여, 토끼나 강아지라는 객체를 만들었는데,
여기서 동물이라는 클래스의 '소리' 라는 메소드를 실행했을 때, 자식 클래스인 토끼나 강아지가 각기다른 소리를 내는 것이 다형성이 부각된 부분입니다.

◽ 얻는점

  • 코드 간결하게 유지
  • 유연성을 가짐

상속 관계에 있다면, 새로운 자식 클래스가 추가되어도 부모 클래스의 함수를 참조해오면 되기 때문에 다른 클래스는 영향을 받지 않게 된다.


4-1. 다형성의 예시 (feat. 오버로딩, 오버라이딩)


✨ 오버로딩

◽ 개념

같은 이름의 메소드를 여러 개를 선언하는 기법
-> 크게 같은 이름의 메소드가 저마다 다른 매개변수로 여러개 선언되어 있다. 그렇기에 메소드의 이름으로 이들을 구분짓는 것이 아닌, 전달된 값의 타입 or 개수 등으로 알아서 구분하여 알맞은 메소드가 자동으로 호출된다.

void dog() { System.out.println("매개변수 ㅇ"}
void dog(int a) {System.out.println("매개변수: " + a }
void dog(int a, int b) {System.out.println("매개변수: " + a + b}

✨ 오버로딩 (재정의)

◽ 개념

부모 필드에 같은 이름의 a() 메소드가 존재한다면, 자식 객체 생성시 부모 생성자가 먼저 호출되기 떄문에 부모 클래스의 a() 메소드가 먼저 메모리에 올라갈 것이다.
그 후 자식 필드를 완성시킬 때 같은 이름인 a()ㄹ는 메소드가 선언되어 있다면, 같은 이름으로 2개가 각각 메소드가 만들어지는 것이 아닌 기존에 만들어진 부모필드의 a() 메소드 위에 자식에서 작성한 메소드가 덮어 씌워진다.
=> 곧 자식 객체 a() 메소드를 사용하게 되면 재정의 된 기능으로 사용한다. 이것을 '오버라이딩'(재정의)이라고 한다.

요약

  1. 오버라이딩이란 상속받은 메소드를 자식 클래스에서 재정의하여 사용하는 것이다.
  2. 자식 클래스에서 부모의 메소드를 수정해야 할 때 사용된다.
    -> 일반 클래스의 상속 관계에서는 많이 사용되지는 않고 추상 클래스나 인터페이스에서 필수적으로 사용되는 개념이다.
  3. 자식 클래스에서 부모 클래스의 메소드와 동일한 시그니쳐(메소드 이름, 리턴 타입, 매개변수의 개수/ 자료형/순서)를 적용하여야 한다.
  4. 오버라이딩 결과 부모 메소드는 은닉되고 자식 클래스에서 재정의된 메소드만 기본적으로 호출된다.
    -> 필요시 super. 으로 부모 메소드를 호출할 수 있다.

오버로딩 오버라이딩 차이점은?

오버로딩오버라이딩
메서드 이름동일동일
매개변수, 타입다름동일
리턴 타입상관 x동일
profile
초짜 백엔드 개린이

0개의 댓글