TIL - 상속과 캡슐화

DY_DEV·2023년 2월 27일
0

TIL

목록 보기
5/17

2월 27일 상속과 캡슐화 요약정리.

상속

기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소를 의미.

  • 하위 클래스가 상위 클래스가 가진 모든 멤버를 상속받게 된다.

  • 따라서 하위 클래스의 멤버 개수는 언제나 상위 클래스의 그것과 비교했을 때 같거나 많다.

  • 또한, "~클래스로부터 상속받았다"라는 표현보다는 "~클래스로부터 확장되었다"는 표현이 그 역할과 기능을 생각했을 때 더 적절한 표현

  • extendS키워드 사용

  • 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거

  • 클래스를 상속할 때에는 extends 키워드를 사용하며, 클래스명 다음에 extends 상위 클래스명을 사용하여 정의

  • 자바의 객체지향 프로그래밍에서는 단일 상속(single inheritance)만을 허용한다. 다른 말로, 다중 상속은 허용되지 않는다. > 인터페이스 등으로 다중 상속과 비슷한 효과를 낼 수 있다.

다형성: 하나의 객체가 여러 모양으로 표현될 수 있는 것

포함관계

포함(composite)은 상속처럼 클래스를 재사용할 수 있는 방법으로, 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것을 의미

클래스 간의 관계를 설정하는 데 있어서 상속관계를 맺어 줄 것 인지 포함 관계를 맺어 줄 것인지를 어떤 기준으로 판별할 수 있을까?
가장 손쉬운 방법은 클래스 간의 관계가 ‘~은 ~이다(IS-A)’ 관계인지 ~은 ~을 가지고 있다(HAS-A) 관계인지 문장을 만들어 생각해보는 것이다.

메서드 오버라이딩

메서드 오버라이딩(Method Overriding)상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것을 의미

상위 클래스의 메서드를 오버라이딩하려면 다음의 세 가지 조건을 반드시 만족

1. 메서드의 선언부(메서드 이름, 매개변수, 반환타입)이 상위클래스의 그것과 완전히 일치해야한다.
2. 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.
3. 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.

**super 키워드와 super()**

this는 자기 객체를 가리키는 참조 변수명으로 메서드 내에서 멤버변수와 지역 변수의 이름이 같을 때 구분하기 위한 용도로 사용되며 생략 시 컴파일러가 자동으로 추가

this() 메서드는 같은 클래스의 다른 생성자를 호출하는데 사용되며 생성자 내에서만 사용가능하고 항상 첫 줄에 위치해야한다

= this는 자신의 객체, this() 메서드는 자신의 생성자 호출

super 키워드는 상위 클래스의 객체, super()상위 클래스의 생성자를 호출하는 것을 의미한다. 공통적으로 모두 상위 클래스의 존재를 상정하며 상속 관계를 전제한다.

  • super 키워드를 붙이지 않는다면, 자바 컴파일러는 해당 객체는 자신이 속한 인스턴스 객체의 멤버를 먼저 참조한다.
  • 경우에 따라서 상위 클래스의 변수를 참조해야할 경우가 종종 있는데 그 경우 super 키워드를 사용하면 부모의 객체의 멤버 값을 참고
    할 수 있다.

super()

super()this() 메서드처럼 생성자를 호출할 때 사용한다.

그리고 마찬가지로, this()와의 차이는 this()가 같은 클래스의 다른 생성자를 호출하는데 사용하는 반해, super()는 상위 클래스의 생성자를 호출하는데 사용된다.

  • super() 메서드 또한 this()와 마찬가지로 생성자 안에서만 사용가능하고, 반드시 첫 줄에 와야 한다.

**Object 클래스**

Object 클래스는 자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스다. 따라서 자바의 모든 클래스는 Object 클래스로부터 확장된다는 명제는 항상 참이다.

  • 자바 컴파일러는 컴파일 과정에서 다른 클래스로부터 아무런 상속을 받지 않는 클래스에 자동적으로 extends Object를 추가
    하여 Object 클래스를 상속받도록 한다.

  • 대표적인 메소드들
    1. toString() : String 타입을 반환한다. 객체 정보를 문자열로 출력한다.

    1. equals(Object obj): 등가 비교 연산(==)과 동일하게 스택 메모리값을 비교. boolean 타입 반환
    2. hashCode(): 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단. int형 반환한다.
    3. wait(): 현재 쓰레드 일시정지 void타입 반환
    4. notify(): 일시정지 중인 쓰레드 재동작. void 타입 반환

캡슐화

특정 객체 안에 관련된 속성과 기능을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것

  • 데이터 보호 목적 (정보은닉)
  • 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출 방지

패키지

특정한 목적을 공유하는 클래스와 인터페이스의 묶음

자바에서 패키지는 물리적인 하나의 디렉토리(directory)이고, 하나의 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지에 속해있다.

  • 이 디렉토리는 하나의 계층구조를 가지고 있는데, 계층 구조 간 구분은 점(.)으로 표현된다.
  • 패키지가 있는 경우 소스 코드의 첫 번째 줄에 반드시 package 패키지명이 표시되어야 하고, 만약 패키지 선언이 없으면 이름없는 패키지에 속하게 된다.
  • 대표적인 패키지
    • java.lang : 자바의 기본 클래스들을 모아놓음

    • java.util : 확장 클래스를 묶어 놓음

    • java.io / java.nio : 자바의 입출력과 관련된 클래스들

      = 우리가 주로 사용하는 String 클래스의 실제 이름은 java.lang.String인데, 여기서 java.lang은 패키지명을 나타내고 점(.)을 사용하여 디렉터리 계층구조를 나타내고 있다.

  • 패키지로 클래스를 묶는 것의 또 하나의 장점은 클래스의 충돌을 방지해주는 기능이다. > 이름이 같은 클래스를 가지고 있어도 각각 다른 패키지에 소속되어 있다면 이름명으로 인한 충돌이 발생하지 않는다.

Import 문

import문다른 패키지 내의 클래스를 사용하기 위해 사용하며, 일반적으로 패키지 구문과 클래스문 사이에 작성한다.

import 패키지명.클래스명; 또는 import 패키지명.*;

import문을 사용하지 않고 다른 패키지의 클래스를 사용하기 위해서는 패키지명을 모두 포함시켜서 클래스의 패키지에 대한 정보를 제공해야한다

  • 같은 패키지에서 여러 클래스가 사용될 때는 import문을 여러번 사용하기보다는 위에 작성된 것처럼 import 패키지명.* 으로 작성하면 해당 패키지의 모든 클래스를 패키지명 없이 사용가능

접근 제어자

제어자(Modifier)

= 클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드를 의미한다. (형용사의 역할)

  • 접근 제어자, 기타 제어자로 구분된다.
  • 하나의 대상에 대해서 여러 제어자를 사용할 수 있다.
  • 하지만 각 대상에 대해서 접근 제어자는 단 한번만 사용이 가능하다.

접근 제어자 **(Access Modifier)**

= 클래스 외부로의 불필요한 데이터 노출을 방지한다.

= 외부로부터 데이터가 임의로 변경되지 않도록 막을 수 있다.

public(접근 제한 없음) > protected(동일 패키지 + 하위클래스) > default(동일 패키지) > private(동일 클래스)

getter와 setter 메서드

객체지향의 캡슐화의 목적을 달성하면서도 데이터의 변경이 필요한 경우 ex) private 접근 제어자가 포함되어 있는 객체의 변수의 데이터값을 추가하거나 수정하고 싶을 때

  • setter 메서드는 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 해주고 일반적으로 메서드명에 set-
    을 붙여서 정의한다.
  • getter 메서드는 이렇게 설정한 변수 값을 읽어오는 데 사용하는 메서드다.
  • setter와 getter 메서드를 활용하면 데이터를 효과적으로 보호하면서도 의도하는 값으로 값을 변경하여 캡슐화를 보다 효과적으로 달성할 수 있다.

인텔리제이 generate alt+ insert 입력시 getter setter 안나오는 이유
1. 롬복 라이브러리 사용 후 객체에 @Getter 선언하면 자동으로 생성된다.
2. 마우스 위치 문제. 코드영역을 다시 확인해보자

https://www.inflearn.com/questions/469584/getter-setter-인텔리제이에서-만드는-법

0개의 댓글