순간을 기록으로

[Java] - 상속(Inheitance), 캡슐화(Encapsulation) 질문들 본문

Development/JAVA

[Java] - 상속(Inheitance), 캡슐화(Encapsulation) 질문들

luminous13 2022. 5. 12. 13:45

객체지향의 4가지 핵심개념

안녕하세요. 오늘도 저번과 마찬가지로 기술면접을 보는 상황을 가정하고 학습한 개념을 질문으로 만들어 봤습니다.

 

 

  • OOP의 4가지 특징은 무엇인가요?
    • 객체지향언어는 다음과 같은 4가지 특징이 있습니다. 
    • 상속(Inheritance)
    • 캡슐화(Encapulation)
    • 다형성(Polymorphism)
    • 추상화(Abstraction)
  • OOP의 5가지 설계 원칙은 무엇이 있나요?
    • 객체지향언어에는 SOLID라는 5가지 설계 원칙이 있습니다.
    • Single Responsibility Principle(SRP, 단일책임원칙): 객체는 하나의 책임만 가져야 한다.
    • Open Close Principle(OCP, 개방 폐쇄 원칙): 기능을 추가할 때 기존의 코드 변경하지 않아야 한다. 
    • Liskov Substitution Priciple(LSP, 리스코프 치환 원칙): 상위 타입의 객체를 하위 타입의 객체로 치환해도 동작에 문제가 없어야 한다.
    • Interface Segregation Principle(ISP, 인터페이스 분리 원칙): 객체(클라이언트)는 자신이 이용하지 않은(호출하지 않은) 메소드에는 의존하지 말아야 한다.
    • Dependency Inversion Principle(DIP, 의존성 역전 원칙): 하위클래스, 구체클래스에 의존하는 게 아닌 인터페이스, 추상클래스, 상위 클래스에 의존해야 한다.
  • 클래스 간의 관계에는 어떤 관계들이 있나요?
    • 상속관계
    • 포함관계
  • 포함관계(composite)란 무엇인가요?
    • 포함관계란 클래스의 필드로 다른 클래스의 참조변수를 선언하는 것을 말합니다.
  • 상속(Inheritance)이란 무엇인가요?
    • 상속이란 상위 클래스의 멤버(필드, 메소드, 이너클래스)를 하위 클래스에게 물려주는 것을 말합니다. 물려주는 클래스를 상위클래스, 물려받는 클래스를 하위 클래스라고 합니다. 상속을 통해 두 클래스는 상속관계를 가집니다.
      • 단, 부모 클래스의 private 멤버는 상속에서 제외됩니다.
  • 상속(Inheritance)은  사용할까요?
    • 1.코드 중복을 제거하여 생산성을 높일 수 있습니다.
    • 2.OOP의 다른 특징인 다형성을 표현할 수 있습니다.
      • 다형성을 활용하여 상위클래스의 참조변수가 하위 클래스의 인스턴스를 가리킬 수 있습니다.
  • 클래스 간의 관계를 상속관계로 할지, 포함관계로 할지 어떻게 판단하나요?
    • 두 클래스가  '~는 ~다(IS-A)' 에 해당한다면 상속관계 입니다.
    • 두 크랠스가 '~는 ~을 가지고 있다(HAS-A)'에 해당한다면 포함관계 입니다.
  • 메소드 오버라이딩(Overriding)이란 무엇인가요?
    • 메소드 오버라이딩이란 부모클래스에서 상속받은 메소드를 재정의하는 것을 말합니다.
  • 메소드 오버라이딩(Overriding)하려면 어떤 조건을 만족해야 되나요?
    • 1.오버라이딩이란 메소드의 동작만 재정의 하는 것이므로, 메소드의 선언부는 기존 메소드 선언부와 일치해야 합니다.
    • 2.부모 클래스의 메소드에 있는 접근 제어자보다 더 좁은 범위로 변경할 수 없습니다.
    • 3.부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없습니다.
  • 메소드 오버라이딩(Overriding)은 사용할까요?
    • 자식 클래스에 적합하게 메소드 기능을 변경하고 싶을 때 사용합니다. 자주 사용하는 예는 Object#toStirng() 메소드를 오버라이딩하여 객체가 가지고 있는 필드 값을 확인 할 때 사용할 수 있습니다.
  • 오버로딩과 오버라이딩을 설명해주세요.
    • 오버로딩이란 한 클래스 안에 같은 이름을 가지는 메소드를 여러 개 정의하는 것을 말합니다.
    • 오버라이딩은 상속받은 메소드를 하위 클래스에서 재정의하는 것을 말합니다.
    • 좀 더 직관적으로 비교하자면 오버로딩은 새로운 메소드를 만드는 것(new)이고, 오버라이딩은 상속받은 메서드의 내용을 변경하는 것입니다.(modify)
  • super와 super() 차이점을 설명해주세요
    • super부모 클래스로부터 상속받은 멤버를 참조할 때 사용하는 참조변수입니다. 부모클래스의 멤버와 자식 클래스의 멤버 이름이 같은 경우 super를 사용하여 구별할 수 있습니다.
    • super()부모클래스의 생성자를 호출할 때 사용합니다. 자식 클래스의 인스턴스를 생성하면 자식 클래스의 고유 멤버뿐만 아니라 부모 클래스의 멤버도 포함됩니다. 따라서 부모 클래스의 멤버를 초기화하기 위해 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출해야 합니다. 생성자의 첫 줄에 위치해야 합니다.
  • Object 클래스르 제외한 모든 클래스의 생성자 첫 줄에는 무엇을 작성해야 되나요?
    • this() 또는 super()을 작성해야 합니다. 만약 작성하지 않으면 컴파일러가 super()을 첫 줄에 삽입합니다.
  • Object 클래스란 무엇인가요?
    • 최상위 클래스입니다. 모든 클래스는 Object 클래스를 상속합니다. 그렇기에 만약 상속을 받지 않았다면 컴파일러가 자동적으로 extends Object를 삽입합니다. 이를 통해 Object 멤버들을 상속받습니다. (ex.toString(), equals(), hashCode()..)

Object에 정의된 멤버들

 

  • 캡슐화(Encapsulation)란 무엇인가요?
    • 연관된 목적을 가지는 속성(필드)과 행위(메서드)를 하나로 묶어 , 실제 구현 내용 일부를 감추고 보호하는 것을 말합니다.
  • 캡슐화(Encapsulation)를 하나요?
    • 1.데이터를 보호할 수 있습니다.
    • 2.불 필요한 정보를 감출 수 있습니다.
  • 캡슐화의 장점은 무엇인가요?
    • 1.데이터 접근을 제한하므로 유지보수가 쉬워집니다.
    • 2.코드를 쉽게 확장할 수 있습니다.
  • 캡슐화를 하여 정보를 감추려면 어떻게 해야 되나요?
    • 접근 제어자(Access Modifier)를 사용하여 정보의 접근 범위를 제한할 수 있습니다.
  • 패키지(Package)란 무엇인가요?
    • 패키지란 연관된 클래스와 인터페이스가 모인 디렉터리입니다. 
    • 특정 패키지에 속한다면 반드시 소스코드 첫 줄에 작성해야 됩니다.
    • java.lang: 자바 기본 클래스들이 들어있는 패키지
    • java.util: 자바 확장 클래스들이 들어있는 패키지
  • 패키지의 장점은 무엇인가요?
    • 클래스 이름이 같아도 다른 패키지에 들어있으면 구별할 수 있습니다. 이를 통해 협업에서 이름이 충돌하는 문제점을 해결할 수 있습니다.
  • Import문은 무엇인가요?
    • 다른 패키지에 있는 클래스를 편하게 사용하기 위해 사용합니다. 만약 Import 문을 사용하지 않으면 클래스를 사용하기 위해 앞에 패키지명을 모두 작성해야 합니다. 예를 들면 java.util.Arrays.sort()와 같이 모두 입력을 해주여야 합니다.
    • java.lang은 컴파일러가 기본적으로 자동적으로 삽입해 줍니다.
    • 패키지과 구문과 클래스 구문 사이에 작성합니다.
  • 제어자(Modifier)란 무엇인가요?
    • 클래스, 필드, 메소드, 생성자 등에 부가적인 의미를 부여해주는 것입니다. 접근 제어자와 기타 제어자 2가지가 있습니다.

제어자에는 2가지 종류가 있다

 

  • 접근 제어자(Access Modifier)는 왜 사용하나요?
    • 정보 은닉(data hiding)을 하기 위해서 사용합니다. 사용자가 굳이 알 필요가 없는 정보나 보안이 중요한 데이터는 직접 접근을 막아야 합니다. 접근 제어자의 설정을 통해 클래스 외부에서 멤버에 직접 접근을 막을 수 있습니다.
  • 접근 제어자 4가지를 설명해주세요
    • 접근 제어자에는 1.private 2.default 3.protected 4.public이 있습니다.
    • private: 클래스 안에서만 클래스 멤버에 직접 접근할 수 있습니다. 외부에서 private 멤버에 접근하려면  해당 객체의 public 메소드를 통해서만 접근할  수 있습니다.
    • default: 클래스 안 + 같은 패키지(디렉토리) 안에서만 protected 멤버에 직접 접근할 수 있습니다.
    • protected: 클래스안 + 같은 패키지 안 + 다른 패키지의 자식 클래스 안까지  default 멤버에 직접 접근할 수 있습니다. 참고로 접근 제어자를 작성하지 않으면 디폴트로 default 접근 제어자가 선택됩니다.
    • public: 패키지와 클래스에 상관없이 어느 곳에서든 접근이 가능합니다. 

  • getter와 setter는 필요할까요?
    • 접근제어자가 private인 멤버변수에 간접적으로 접근하기 위해 필요합니다. getter는 가져올 수 있고, setter를 통해 값을 변경할 수 있습니다.
Comments