[북스터디] 자바 코딩 인터뷰 완벽 가이드_ch6객체지향프로그래밍(1)_객체/클래스/추상화

Wang_Seok_Hyeon·2023년 7월 28일
0
post-thumbnail

Intro

이번부터 해서, 해당 주제를 통해 40여 가지의 질문과 해당하는 핵심 개념, 그리고 해당 주제에 관해 답변하는 방식에 대해 알아 볼 것이다. 책에서는 예제를 다 다루지 못한다거나, github에서 예시코드가 변경되어 적절하지 않은 경우들을 적절하게 수정하여 다룰 예정이다. 지면이 굉장히 길어질 수 있기 때문에 끊어서 주제를 다룬다.

객체, 클래스, 추상화, 캡슐화, 상속, 다형성, 연관, 집약, 구성을 먼저 다룰 예정이며 해당 내용을 3번에 걸쳐 소개한다. :)

이번은 그 첫 번째 시간으로 객체와, 클래스, 추상화에 대해 이야기 할 것이다.
이러한 기초 개념들을 정리하는 이유는, 너무나도 당연하다고 생각했던 개념들이 막상 설명해 보라고 하면 어려운 것과 마찬가지로 이를 정리하고 알아감으로써 더 깊이 있는 이해와 성장의 토대를 쌓기 위함이다.

객체(Object)

1. 객체란 무엇인가?

필수 개념

  • 객체는 객체지향 프로그래밍의 핵심 개념 중 하나다.
  • 객체는 실세계의 개체다.
  • 객체는 상태(필드)와 동작(메서드)을 가진다.
  • 객체는 클래스의 인스턴스를 나타낸다.
  • 객체는 메모리에서 공간을 차지한다.
  • 객체는 다른 객체와 소통한다.

실제 답변은 아래와 같이

객체는 객체지향 프로그래밍의 핵심 개념 중 하나입니다 객체는 차 ,탁자, 고양이와 같은 실세계의 개체와 같습니다. 수명주기(life cycle)동안 객체는 상태와 동작을 가집니다. 예를 들어 고양이의 ‘상태’는 색, 이름, 품종이 될 수 있고 고양이의 ‘동작’은 놀고, 먹고, 자고, 야옹 소리를 내는 것일 수 있습니다. 자바에서 객체는 new 키워드를 통해 만들어진 클래스의 인스턴스로 필드에 상태를 저장하고 메서드로 동작을 표현합니다. 각 인스턴스는 메모리 공간을 차지하며 다른 객체와 소통할 수 있습니다. 예를 들어, 다른 객체에 해당하는 ‘소년’은 역시 객체에 해당하는 고양이를 어루만지거나 잠을 재울 수 있습니다.

추가적인 연관 지식.

  • 객체가 각기 다른 접근 제어자(access modifier<public, protected, default, private>) 및 가시성 범위를 가질 수 있고, 가변 또는 불변 속성(final)을 가지며, 가비지 컬렉터(garbage collector)를 통해 객체가 수집된다. 는 내용이 있다.
    ** 가비지 컬렉터(garbage collector)란?
    프로그램이 할당했던 메모리 영역 중에서 필요 없는 영역을 해제하는 메모리 관리 기법

클래스(Class)

2. 클래스란 무엇인가?

필수 개념

  • 클래스는 객체지향 프로그래밍의 핵심 개념 중 하나다.
  • 클래스는 객체를 생성하기 위한 템플릿 또는 청사진(blueprint)이다.
  • 클래스는 인스턴스화하기 전까지는 메모리의 힙 영역을 소모하지 않는다.
  • 클래스느 여러 번 인스턴스화 한다.
  • 하나의 클래스는 하나의 작업만 한다.

실제 답변은 아래와 같이
클래스는 객체지향 프로그래밍의 핵심 개념 중 하나입니다. 클래스는 특정 타입의 객체르르 만드는 데 필요한 지침의 집합입니다. 클래스는 템플릿, 청사진 또는 객체를 만드는 방법을 알려주는 레시피라고 할 수 있습니다. 객체를 만드는 과정을 '인스턴스화한다.'고 하며 new 키워드로 수행할 수 있습니다. 클래스는 여러 번 인스턴스화하여 원하는 만큼 많은 객체를 만들 수 있습니다. 클래스의 정의는 파일 형태로 하드 드라이브에 저장될 뿐 메모리의 힙 영역을 소모하지 않습니다. 클래스를 인스턴스화하면 생성된 객체는 메모리 힙 영역에 할당됩니다. 클래스가 따라야 하는 중요한 원칙 중 하나는 단일 책임 원칙(single responsibility principle(SRP))입니다. 클래스는 이 원칙을 따르면서 단 하나의 일을 할 수 있도록 설계 및 작성되어야 합니다.

추가적인 연관 지식.

클래스가 각기 다른 접근 제어자 및 가시성 범위를 가질 수 있고, 로컬, 클래스, 그리고 인스턴스 변수 등 다양한 타입의 변수를 지원하며 abstarct, final 또는 private으로 선언할 수 있고, 다른 클래스(내부 클래스) 에 중첩될 수 있다. 는 내용이 있다.

추상화(abstraction)

3. 추상화란 무엇인가?

필수 개념

  • 추상화는 객체지향 프로그래밍의 핵심 개념 중 하나다.
  • 추상화는 사용자와 관련 있는 내용만 노출하고 나머지 세부 내용은 숨기는 개념이다.
  • 추상화를 통해 사용자는 애플리케이션이 일을 수행하는 방법이 아니라 애플리케이션이 수행하는 일 자체에 집중할 수 있다.

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

아이슈타인은 ‘모든 것은 더 단순하게 만드는 것이 아니라 가능한 한 단순하게 만들어야 한다.’고 말했습니다. 추상화는 사용자를 위해 무언가를 최대한 간단하게 만들고자 하는 객체지향 프로그래밍의 핵심 개념 중 하나입니다. 객체지향 프로그래밍의 객체는 사용자에게 높은 수준의 작업 집합만 노출하고 작업의 내부 구현 내용은 숨겨야 한다는 말이 있습니다. 이 개념을 구현하는 추상화를 통해 사용자는 애플리케이션이 일을 수행하는 방법이 아니라 수행하는 일 자체에 집중할 수 있습니다. 즉, 내용을 노출하는 복잡성을 줄이고 코드의 재사용성을 높이며 중복을 방지하고 낮은 결합도와 높은 응집도를 유지합니다. 또한 중요한 내용만 공개하여 애플리케이션의 보안과 재량권을 유지합니다.

실생활의 예를 들어보겠습니다. 차를 운전하는 남자가 있다고 가정하겠습니다. 이때, 남자는 각각의 페달이 무슨 일을 하는지, 핸들이 무슨 일을 하는지 알고 있지만, 페달과 핸들에 힘을 실어주는 차 내부의 메커니즘은 전혀 알지 못하는 경우가 많습니다. 이것이 추상화입니다.”

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

public interface Car{
	public void speedUp();
	public void speedDown();
	public void turnRight();
	public void turnLeft();
	public String getCarType();
}

추상화를 좀 더 이해하도록 차를 운전하는 남자에 관해서 계속 이야기 해 보겠습니다. 이 남자는 적절한 페달을 이용해서 차의 속도를 높이거나 늦출 수 있습니다. 또한 핸들을 이용해 좌회전과 우회전을 할 수도 있습니다. 이 모든 작업은 Car라는 이름의 인터페이스로 통합할 수 있습니다.

다음으로 각 차량의 타입은 Car 인터페이스 구현에 정의된 동작의 내용을 제공하기 위해 메서드를 오버라이드(override) 해야 합니다. 이 구현 내용은 차를 운전하는 남자인 사용자에게는 노출되지 않습니다.

예를 들어 EltricaCar 클래스는 다음과 같이 나타냅니다.(물론 실제 세계에서는 System.out.println 대신 훨씬 복잡한 비즈니스 논리가 있을 것입니다._이와 같은 멘트를 추가해 주는 것도 좋을 수 있습니다!)

public class ElectricCar extends Car {
    public ElectricCar(String carType){
			this.carType = carType;
		}

    @Override
    public void speedUp() {
        System.out.println("Speed up the electric car");
    }

    @Override
    public void slowDown() {
        System.out.println("Slow down the electric car");
    }

    @Override
    public void turnRight() {
        System.out.println("Turn right the electric car");
    }

    @Override
    public void turnLeft() {
        System.out.println("Turn left the electric car");
    }
	  @Override
    public String getCarType() {
       return this.carType;
    }
}

Outro

이처럼 예시 등이 나오고, getter setter 생성자 등도 모두 생략하지 않고 다룰 예정이다.
그렇게 하고자 하는 이유는 길어지더라도 하나를 정확하게 생략없이 볼 수 있는 지면이 필요하고 이를 정리하기 위해 지면을 나누고 알아가는 것이기 때문이다.
많은 사람들에게 도움이 될 수 있는 책이다. 다루지 않은 ch1~ch5까지도 유익한 인성면접의 내용이 많이 들어있다. 특히 해외 취업을 준비하는 분들이라면 이 책은 필수서적이라 생각된다. 외국 기업의 예시와 내용이 많이 들어 있기 때문이다.

profile
하루 하루 즐겁게

1개의 댓글

comment-user-thumbnail
2023년 7월 28일

좋은 글 감사합니다. 자주 올게요 :)

답글 달기