객체지향을 더 정확하게 이해하기

Minseok-Choi·2022년 1월 16일

스터디

목록 보기
3/8

(미완성 글입니다.)

1.서론
2.상속
3.추상화
4.캡슐화
5.다형성

서론

자바를 공부하면 기본적인 코드를 작성하는 법을 배우고 난 뒤에 학습하게 되는 것이 객체지향이다.

객체지향을 공부하면서 가장 중요한 4가지 키워드 (캡슐화, 상속, 추상화, 다형성 )를 당연하게 학습하게 된다. 그리고 자연스럽게 예제코드를 따라치면서, 그 개념을 이해한다.

나의 경우로는 처음에는 이 개념에 대해서 이해를 잘 하지 못했고, 머리 속에서 붕붕 떠있는 기분이 들었다.
또한, 객체지향을 활용했을 때의 장점들을 이론으로만 알고있을 뿐, '그래서 어떤 상황에서 사용해야하고, 그 상황에서 사용하면 왜 좋다는 거야?' 라는 의문을 품고 있었다.

그렇게 돌고돌아 아직도 얕은 이해겠지만, 개념들이 내 머리 속에서 자리잡기 시작한 것 같아서 키워드마다 정리를 시작해보려고 한다.
그리고 이해가 깊어질수록 이 글을 계속 수정해나가려고 한다.

키워드의 순서는 추후에 수정을 할 예정이다.

상속

  • 상속에 대한 이해 더 정확하게 하기

스프링 입문을 위한 자바 객체지향의 원리와 이해를 참고하였습니다.

상속의 개념

  • 상속을 영어로 번역하면 inheritance이다.
  • 그리고 조상과 자손을 예시로 설명을 자주하곤 한다.
  • 틀린 말은 아니지만, 나의 경우로는 이렇게 단순한 예시를 일반화시켜 이해하니 와닿지가 않았다.
  • 자바에서는 상위 클래스를 상속할 때, extends 예약어를 사용한다.
  • 그래서 inheritance로 이해하는 것보다 extend, 즉 상위 클래스를 확장한다는 개념으로 이해하는 것이 더 와닿는다.
  • 상속은 추상적인 상위클래스를 조금 더 일반화시키는 것으로 볼 수도 있다. Ex) 포유류 extends 동물

상속의 목적과 올바른 상속

  • 상속의 장점은 코드의 재사용다형성을 통한 코드의 유연성이다.
  • 하지만 객체지향 프로그래밍에서 코드의 재사용을 목적으로 하는 상속은 금한다.
    • 무분별한 상속이 낳는 문제점
      1. 상위클래스의 변경으로 인한 하위클래스에 대한 영향
      2. 불필요한 클래스의 증가
      3. 잘못된 상속의 사용
  • 잘못된 상속과 올바른 상속을 구별할 때 is a 관계인지 확인한다.
    • 하위클래스는 상위클래스이다. Ex) 포유류 extends 동물 -> 포유류는 동물이다.
    • 그리고 더욱 오해없는 이해를 위해서는 is a kind of로 대입하여 확인하는 것이 더 좋다. Ex) 포유류는 동물의 한 분류이다.

조상과 자손으로 설명하는 상속이라면? Ex) 아들 extends 아버지 -> 아들은 아버지이다.(???)

그래서 상속을 확장으로 이해하는 것이 좋다.

추상화

캡슐화

다형성

다형성 개념

  • 객체지향에서 다향성이라고 하면 오버라이딩과 오버로딩이라고 할 수 있다.
  • 상위 클래스와 하위 클래스 사이, 인터페이스와 구현 클래스 사이에서 다형성을 이야기할 수 있다.
  • 하지만 가장 기본은 오버라이딩과 오버로딩이다.
    • 오버로딩이 다형성인지 아닌지에 대해서는 이견이 있다
  • 오버라이딩 : 같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 재정의
  • 오버로딩 : 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의
    • 오토바이와 같은 탈것에 ride(올라타다), 트럭에 짐을 옆으로 나란히 road(적재하다) 개념으로 생각하기

예제 코드

package polymorphism;

public class Animal {

    public String name;

    public void showName() {
        System.out.printf("내이름은 %s",name);
    }
}
package polymorphism;

public class Penguin extends Animal{

    public String habitat;

    public void showHabitat() {
        System.out.printf("나는 %s에 살아\n",habitat);
    }

    @Override
    public void showName() {
        System.out.println("안알랴줌ㅎㅎ");
    }

    //오버로딩
    public void showName(String name) {
        System.out.printf("%s 안녕, 내이름은 %s야\n",name,this.name);
    }
}
package polymorphism;

public class Main {

    public static void main(String[] args) {
        Penguin pororo = new Penguin();

        pororo.name = "뽀로로";
        pororo.habitat = "남극";

        Animal pingu = new Penguin();

        pingu.name= "핑구";

        pororo.showName(); //안알랴줌ㅎㅎ
        pororo.showHabitat(); //나는 남극에 살아
        pororo.showName(pingu.name); //핑구 안녕, 내이름은 뽀로로야

        pingu.showName(); //안알랴줌ㅎㅎ
    }
}

다형성 : 사용편의성

  • 다형성이 없을 때, 두 수를 더하는 함수가 있다면?
    • byte, short, int, long, char,float, double과 같이 자료형(인자)가 변화가 있을 때마다 각각의 이름으로 새로운 함수를 생성해야한다.
    • 하지만 오버로딩을 사용하면, 같은 함수 이름으로 인자 목록으로 다르게 하면 된다.
    • 또한 제네릭을 사용해서, 하나의 함수만 구현해도 다수의 함수를 구현한 효과를 낼 수도 있다.
  • 그래서 다형성을 사용편의성으로 정의할 수 도 있겠다.
profile
차곡차곡

0개의 댓글