파게로그

Has A 관계와 Is A 관계 본문

콤퓨타 왕기초/Java

Has A 관계와 Is A 관계

파게 2020. 11. 18. 02:06
Has A 관계

Has A 관계은, Has A 상속이라고도 하지만 사실상 상속도 아닌 것과 같아서 Has A 관계라고도 곧잘 불린다. 상속에 대해서는 잘 언급되지 않는 개념이지만, 이렇다고 알고 있으면 된다. Python에서는 compositoin으로 def foo(bar):과 같이 사용되고, Java에서는 특별한 문법 없이 포함 관계로서 설명할 수 있다.

 

캡슐들은 다른 캡슐을 사용하거나, 다른 캡슐에 의해 사용되는 관계를 가지고 있는데, 어떤 캡슐에 다른 캡슐을 포함하는 것을 Has A 관계라고 할 수 있다. Car 클래스와 Engine 클래스가 있을 때, Car 클래스 내에서 Engine 클래스의 인스턴스를 생성한다면 Car Has A Engine이 된다. 이 때 Car 클래스 내에서 Engine 클래스의 변수와 메서드를 모두 사용할 수 있게 된다. Has A 관계는 composition(구성) 관계라고도 설명할 수 있는데, 하나의 객체가 다른 객체를 가지고 있기 때문이다. Has A 관계를 맺는 두 객체는 서로 느슨하게 결합(loosely coupled)되어 코드 변경에 있어서 비교적 자유롭지만, 실제 구현은 굉장히 복잡해질 수 있다.

 

부품으로 갖고 있는 건 포함(구성) 관계!

예를 들어 StudentConsole, StudentList, Student가 있으면

StudentConsole은 Student를 사용하고, StudentConsole-StudentList-Student는 포함한다.

구성 관계만 있는 StudentList는 생략하고, StudentConsole는 Student를 가지고 있고, 이를 통해 사용 관계는 생략할 수 있다. 그렇다면 StudentConsole은 Student를 Has A 상속관계를 가지고 있다고 한다.(부품으로 물려받았다! 캡슐이 다른 캡슐의 개체를 가지고 있는 상태)

 

- Composition Has A (처음부터 다 만들고 시작. 일체형. 멤버로서, 같이 만들어짐.)

- Aggregation Has A (집합적으로 갖는다. 필요할 때마다 누적. 예를 들어서 new Student[3]은 하지만, new Student()는 하지 않음) (StudentConsole)

사용 관계: 객체 직접 만들어서 사용. 점선(dependency) (클래스를 구성하는 멤버는 아님)

 

 


 

'캡슐화', '상속', '다형성'이 OOP의 3대 덕목이라 불린다고 하는데, 실제로 대개 '상속'이라고 하면 Is A 관계를 말한다. 이는 구성(composition)이 아니라 상속의 대상이 틀 또는 framework의 개념으로서, Is A 관계는 수평적인 Has A 관계와 달리 수직적이다. 예를 들어 어떤 로봇을 만들 때 머리 부품, 다리 부품은 Has A 관계이며 몸통을 만드는 데 필요한 틀이 있다면 Is A 관계이다. Java 진영에서는 자식클래스/하위클래스/파생클래스(this)와 이것이 extends하는 부모클래스/상위클래스/기반클래스(super)로 부른다. 한편 자식 타입은 부모 타입에 대한 명세(specification)를 암시한다는 점에서, 서브타입이라고 할 수 있다. 원칙적으로 부모클래스의 변수와 메서드만 호출할 수 있고, 자식클래스의 변수와 메서드는 호출할 수 없다. 다만 자식클래스에 부모클래스에게서 override한 메서드가 있는 경우, 해당 메서드는 호출할 수 있다.

 

extends를 사용하면, 자식 클래스를 만들 때 두 개의 객체가 생성된다.(자신과 부모 클래스의 객체)

 

@Override

부모가 가지고 있는 메서드를 가린다. Eclipse에서 Ctrl+Space로 override 가능한 메서드를 찾을 수 있다.

 

class Student {
    String name;
    int id;
    
    public Student() {
    	name = "홍길동";
        id = 20200000;
    }
    
    public Student(name, id) {
    	this.name = name;
        this.id = id;
    }
}

class ElementaryStudent extends Student {
	int parentPhoneNum;
    
    public ElementaryStudent() {
    	this("홍길동", 20200000, 01000000000);
    }
    
    public ElementaryStudent(name, id, parentPhoneNum) {
    	super(name, id);
        this.parentPhoneNum = parentPhoneNum;
    }
}

 

---

 

Student st = new ElementaryStudent(); // 가능 -> 하나의 ElementaryStudent에 대한 참조형식은 2개

ElementaryStudent st = new Student(); // 불가능

 

메서드는 Student의 메서드를 사용하게 된다? X.

자바는 참조형식의 함수보다 객체 형식의 함수 호출을 우선으로 한다!

즉 참조형식은 Student라도 객체가 ElementaryStudent 형식이기에 객체쪽의 메서드를 사용!

단, 참조형식이 그 메서드가 없으면(참조형식의 메서드가 오버라이드 메서드가 아니라면) 오류 발생. 호출 자체가 불가능함.

'콤퓨타 왕기초 > Java' 카테고리의 다른 글

비트 연산  (0) 2021.03.04
코드 재사용  (0) 2020.11.18
생성자  (0) 2020.11.18
method overloading in Java  (0) 2020.11.16
다른 언어와 헷갈리는 문법을 모아보자  (0) 2020.11.14
Comments