객체지향 프로그래밍 상속성

Sitehyun·2022년 12월 31일
0

IT Log

목록 보기
5/10

저번주 주말이 크리스마스였는데 어느새 일주일이 가고 신년이 코앞이다. 내년부터는 만나이로 한다고하니 떡국 몇 그릇 정도는 먹어도 되지않나 싶다.

오늘부터 객체지향 프로그래밍의 상속성, 캡슐화, 다형성, 추상화를 공부해보자...!


상속

자바 언어에서 상속이란 기존 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법적 요소이다.

간단하게 말하자면 두 클래스를 상위 클래스와 하위 클래스로 나누어 상위 클래스의 멤버를 하위 클래스와 공유하는 것이다. 이때 이 두 클래스가 상속관계에 있다 말하고, 하위 클래스는 상위클래스의 모든 멤버를 상속받아 사용할 수 있다.

따라서, 하위 클래스의 멤버는 언제나 상위 클래스의 멤버 수와 같거나 많다.

위의 그림에서 총 4개의 클래스가 정의되어있다.

아래의 3개의 클래스를 먼저 살펴보면 Programmer, Dancerm, Singer 의 속성과 기능이 정의되어있다. 그 중 name, age, walk 등과 같이 3개의 클래스가 중복으로 가지고 있는 속성과 기능들이 보일 것이다.

Programmer, Dancerm, Singer은 사람이다. 그리고 사람이라면 가져야할 공통점이 존재한다. 이 그림은 그 공통점을 하나로 모아 Person이라는 클래스에 정의한 것이고, 하위의 3개 클래스는 이 Person을 상속받아 공통의 멤버들을 사용할 수 있다.

상속을 통해 클래스의 공통점을 모아 작성하게 되면 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거할 수 있게된다. 또한 나중에 배울 다형성과도 연관되어 있으니 기억해두도록 하자.

상속 키워드 extens

각 클래스의 공통점을 하나로 묶은 클래스 Person을 생성하였다. 이제 우리는 Person을 사용하여 중복 코드를 줄이고 하위 클래스의 기능은 그대로 사용하고자 한다.

extends는 상위 클래스의 멤버를 사용할 수 있게 만드는 상속 키워드 이다.

class 클래스명 extends 싱위클래스명 {
	...생략...
}

이로서 우리는 코드를 재사용하여 하위 클래스들의 속성과 기능은 유지하고 중복을 줄일 수 있었다.

아래는 위 그림의 코드 예시이다!

class Person {
    String name;
    int age;

    void learn(){
        System.out.println("공부를 합니다.");
    };
    void walk(){
        System.out.println("걷습니다.");
    };
    void eat(){
        System.out.println("밥을 먹습니다.");
    };
}

class Programmer extends Person { // Person 클래스로부터 상속. extends 키워드 사용
    String companyName;

    void coding(){
        System.out.println("코딩을 합니다.");
    };
}

class Dancer extends Person { // Person 클래스로부터 상속
    String groupName;

    void dancing(){
        System.out.println("춤을 춥니다.");
    };
}

class Singer extends Person { // Person 클래스로부터 상속
    String bandName;

    void singing(){
        System.out.println("노래합니다.");
    };
    void playGuitar(){
        System.out.println("기타를 칩니다.");
    };
}

public class Main {
    public static void main(String[] args){

        //Person 객체 생성
        Person p = new Person();
        p.name = "홍길동";
        p.age = 24;
        p.learn();
        p.eat();
        p.walk();
        System.out.println(p.name);

        //Programmer 객체 생성
        Programmer pg = new Programmer();
        pg.name = "박혁거세";
        pg.age = 26;
        pg.learn(); // Persons 클래스에서 상속받아 사용 가능
        pg.coding(); // Programmer의 개별 기능
        System.out.println(pg.name);

//// 출력결과 
공부를 합니다.
밥을 먹습니다.
걷습니다.
홍길동
공부를 합니다.
코딩을 합니다.
박혁거세
    }
}

메서드 오버라이딩

메서드 오버라이딩은 오버로딩과 비슷하면서 다른 자바의 문법이다. 오버라이딩은 상위 클래스로 부터 상속받은 메서드와 동일한 이름의 메서드를 재정의 하는 것입니다.

또한 메서드 오버라이딩을 사용하려면 세 가지 조건을 만족 시켜야합니다. (오버로딩은 2가지였죠?)

  1. 메서드 선언부(메서드 시그니쳐)가 상위 클래스의 그것과 완전히 일치해야한다.
  2. 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.
  3. 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.
//의사코드

class 상위클래스 {

	void 밥먹기(){
    	System.out.println("밥을 냠냠 먹습니다.");
    }
}

class 하위클래스 {
	
	void 밥먹기(){
    	System.out.println("밥을 허겁지겁 먹습니다");
    }
}

public class Main {
    public static void main(String[] args){
    	하위클래스 lower = new 하위클래스();
    	
        System.out.println(lower.밥먹기);
    }
}

/// 출력
밥을 허겁지겁 먹습니다.

자바 객체지향 프로그래밍의 4가지 기둥 상속성, 캡슐화, 다형성, 추상화 중 상속을 알아보았다. 공부하면 공부할수록 이 4가지의 특성은 서로 연관되어있는게 느껴져서 굉장히 재밌다.

당장 공통점을 모아서 상위를 만드는 것도 추상화인 인터페이스나 추상클래스로 바꿔서 사용할 수도 있는 노릇이니 말이다. 어느 상황에 어느것이 더 사용하기 용이하고 효율적인지는 직접 코드를 짜보고 느껴봐야 알 것 같다!

0개의 댓글

관련 채용 정보