[북스터디] 자바 코딩 인터뷰 완벽 가이드_ch6객체지향프로그래밍(3)_연관/집약/구성

Wang_Seok_Hyeon·2023년 8월 13일
0
post-thumbnail

Intro

SOLID 정리가 확실히 양이 많은 것 같다. 이번 내용이 크게 길지는 않은데 다음 내용이 조금 길다...
그리고 사실, 이번 3가지 개념도 핵심 특징이라는 걸 이번에 학습하면서 알았던 그런 내용이라 새로웠다.

당연하다고 생각했던 것들?이 따로 명칭이 있고 이를 설명하는 방식을 익히는 것도 참 중요한 거 같다. 특히 해당 내용은 한글 보다 영어 이름에 집중해야 할 것 같다.

연관(association)

7. 연관이란 무엇인가?

필수개념.

  • 연관은 객체지향 프로그래밍의 핵심 개념 중 하나다.
  • 연관은 서로 독립적인 두 클래스 간의 관계를 의미한다.
  • 연관은 소유자가 없다.
  • 연관은 일대일, 일대다, 다대일, 다대다 관계가 될 수 있다.

실제 답변은 아래와 같은 틀로

연관은 객체지향 프로그래밍의 핵심 개념 중 하나입니다. 연관은 서로 독립적인 두 클래스 간의 관계를 의미하며 객체 간의 다중 관계라고도 합니다. 연관에는 소유자가 없습니다. 연관 관계에 있는 객체들은 서로 사용 가능한 양방향 연관관계를 가지거나 한 객체만 다른 객체를 사용할 수 있는 단방향 연관 관계를 가지며 자체 수명을 가집니다. 연관에는 단방향이나 역방향, 일대일, 일대다, 다대일, 다대다 관계가 있습니다. 예를 들어 Person(사람)과 Address(주소) 객체에는 양방향 다대다 관계가 있을 수 있습니다. 즉, 한 명의 사람은 여러 개의 주소와 연관될 수 있으며 하나의 주소는 여러 사람에게 속할 수 있습니다. 그러나 사람은 주소 없이 존재할 수 있고, 주소도 사람 없이 존재할 수 있습니다.

추가적인 설명이 필요하면 아래와 같이 코드를 작성할 수 있으며 이를 작성할 때도 계속 설명을 이어 나가야 하며 아래와 같은 플로우를 따르자.

Person 클래스와 Address를 만들고 연관관계는 main 메서드에서 성립됩니다.

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class Address {
    private String city;
    private String zip;

    public Address(String city, String zip) {
        this.city = city;
        this.zip = zip;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getZip() {
        return zip;
    }

    public void setZip(String zip) {
        this.zip = zip;
    }
}
public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Andrei");
        Person p2 = new Person("Marin");
        Address a1 = new Address("Banesti", "107050");
        Address a2 = new Address("Bucuresti", "229344");

        // 메인 메서드에서의 두 클래스 간 연관(Association) 관계
        System.out.println(p1.getName() + " lives at address "
          + a2.getCity() + ", " + a2.getZip()
          + " but it also has an address at "
          + a1.getCity() + ", " + a1.getZip());
        System.out.println(p2.getName() + " lives at address "
          + a1.getCity() + ", " + a1.getZip()
          + " but it also has an address at "
          + a2.getCity() + ", " + a2.getZip());
    }
}

출력 결과는 아래와 같습니다.

Andrei lives at address Bucuresti, 229344 but it also has an address at Banesti, 107050
Marin lives at address Banesti, 107050 but it also has an address at Bucuresti, 229344

집약(aggregation)

8. 집약이란 무엇인가?

필수개념.

  • 집약은 객체지향 프로그래밍의 핵심 개념 중 하나다.
  • 집약은 단방향 연관 관계의 특별한 경우입니다.
  • 집약은 HAS-A 관계를 나타냅니다.
  • 집약 관계에 있는 두 객체는 자체 수명 주기를 가지며 객체 중 하나는 HAS-A 관계의 소유자입니다.

실제 답변은 아래와 같은 틀로

집약은 객체지향 프로그래밍의 핵심 개념 중 하나입니다. 집약은 단방향 연관 관계의 특별한 경우입니다. 연관이 서로 독립적인 두 클래스 간의 관계를 의미한다면, 집약은 두 객체 간의 HAS-A 관계를 의미합니다. 여기서 집약 관계의 두 객체는 자체 수명 주기를 가지며 객체 중 하나는 HAS-A 관계의 소유자`입니다. 자체 수명 주기를 갖는다는 것은 한 객체가 종료되어도 다른 객체에 영향을 미치지 않는다는 의미입니다. 예를 들어 TennisPlayer는 Racket을 가집니다. Racket은 TennisPlayer를 사용할 수 없으므로 이것은 단방향 연관 관계입니다. 또한 TennisPlayer가 없어도 Racket은 영향을 받지 않습니다.

추가적인 설명이 필요하면 아래와 같이 코드를 작성할 수 있으며 이를 작성할 때도 계속 설명을 이어 나가야 하며 아래와 같은 플로우를 따르자.

TennisPlayer클래스와 Racket 클래스는 HAS-A 관계입니다. 따라서 TennisPlayer 클래스는 당므과 같이 Racket 클래스를 포함할 수 있어야 합니다.만들고 연관관계는 main 메서드에서 성립됩니다.

public class TennisPlayer {
    private String name;
    private Racket racket;

    public TennisPlayer(String name, Racket racket) {
        this.name = name;
        this.racket = racket;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Racket getRacket() {
        return racket;
    }

    public void setRacket(Racket racket) {
        this.racket = racket;
    }
}
public class Racket {
    private String type;
    private int size;
    private int weight;

    public Racket(String type, int size, int weight) {
        this.type = type;
        this.size = size;
        this.weight = weight;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }
}
public class Main {
    public static void main(String[] args) {
        Racket racket = new Racket("Babolat Pure Aero", 100, 300);
        TennisPlayer player = new TennisPlayer("Rafael Nadal", racket);

        System.out.println("Player " + player.getName() + " plays with " + player.getRacket().getType());
    }
}

출력 결과는 아래와 같습니다.

Player Rafael Nadal plays with Babolat Pure Aero

구성(association)

9. 구성이란 무엇인가?

필수개념.

  • 구성은 객체지향 프로그래밍의 핵심 개념 중 하나다.
  • 구성은 좀 더 제한적인 집약 관계입니다.
  • 구성은 단독으로 존재할 수 없는 객체를 포함하는 HAS-A 관계를 나타냅니다.
  • 구성은 코드 재사용성과 객체의 가시성 제어를 유지합니다.

실제 답변은 아래와 같은 틀로

구성은 객체지향 프로그래밍의 핵심 개념 중 하나입니다. 기본적으로 구성은 좀 더 제한적인 집약 관계입니다. 집약이 자체 수명 주기를 가지는 두 객체 간의 HAS-A 관계를 의미한다면, 구성은 단독으로 존재할 수 없는 객체를 포함하는 HAS-A 관계를 의미합니다. 이러한 연결고리를 강조하기 위해서 HAS-A 관계는 PART-OF 관계라고도 합니다. 예로, Car는 Engine은 Car와 PART-OF 관계입니다. 차가 파괴되면 엔진도 파괴됩니다. 구성은 객체의 가시성을 제어하고 코드를 재사용 하므로 상속보다 더 낫다고 말합니다.

추가적인 설명이 필요하면 아래와 같이 코드를 작성할 수 있으며 이를 작성할 때도 계속 설명을 이어 나가야 하며 아래와 같은 플로우를 따르자.

Engine 클래스는 꽤 간단합니다. type과 horsepoewr가 핵심이죠.

public class Engine {
    private String type;
    private int horsepower;

    public Engine(String type, int horsepower) {
        this.type = type;
        this.horsepower = horsepower;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getHorsepower() {
        return horsepower;
    }

    public void setHorsepower(int horsepower) {
        this.horsepower = horsepower;
    }        
}

Car 클래스의 경우, 생성자를 보면 Engine은 Car의 일부이기 때문에 Engine으로 Car를 생성하는 것을 알 수 있습니다.

public class Car {
    private final String name;
    private final Engine engine;

    public Car(String name) {
        this.name = name;

        Engine engine = new Engine("petrol", 300);//요 부분입니다.
        this.engine=engine;
    }

    public int getHorsepower() {
        return engine.getHorsepower();
    }
    
    public String getName() {
        return name;
    }    
}

아래는 main 메서드에서 구성 관계의 테스트와 출력 결과를 보겠습니다.

public class Main {
    public static void main(String[] args) {
        Car car = new Car("MyCar");

        System.out.println("Horsepower: " + car.getHorsepower());
    }
}

출력 결과는 아래와 같습니다.

Horsepower : 300

Outro.

이를 끝으로 객체지향 프로그래밍에 관한 중요한 질문과 답변, 앞서 7가지의 예시 코드를 살펴 보았습니다.

위의 질문은 2~4년의 경력이 있더라도 위처럼 술술 나올 수 있는 수준이 되는 개발자가 얼마나 될까 싶은…초심자의 어린 생각과 더불어, 이러한 내용을 학습함으로써 나 역시 더 좋은 개발자, 더 실력을 갖춘 개발자가 될 수 있다는 느낌을 받았습니다.

다음 주제는 계속 언급했지만 SOLID로 5가지 원칙입니다. 이에 관한 내용은 한 번에 업데이트 될 내용으로 양이 많지만 열심히 해 보겠습니다!

profile
하루 하루 즐겁게

0개의 댓글