Java 3주차 (3)

신성훈·2024년 4월 29일

TIL

목록 보기
9/162

오늘의 학습 키워드

  • 생성자
  • this와 this()
  • 접근 제어자
  • package와 import
  • 클래스간의 관계와 상속
  • 오버라이딩
  • 다형성
  • 추상 클래스
  • 인터페이스

생성자 constructor

  • 객체가 생성 될 때 호출되며 객체를 초기화 하는 역할을 수행
  • 모든 클래스는 반드시 생성자가 하나 이상 존재해야한다.
  • 값을 고정해야 한다면 초기값을 직접 대입한다면 필드에 기재
  • 한개 이상의 생성자가 존재하기 때문에 컴파일러가 자동으로 기본 생성자를 추가해주지 않기 때문에 기본 생성자가 존재하지 않아 오류가 발생
  • 생성자가 선언되어있다면 컴파일러는 기본 생성자를 추가하지 않습니다.
  • 오버로딩을 할 때 개수, 타입, 순서가 동일한데 매개변수명만 다르게 하는 경우는 오버로딩 규칙에 위배되기 때문에 오류가 발생

this와 this()

  • thin 자기자신, 인스턴스 해당 클래스 안에서 나를 가르키는 것을 this
  • this() 키워드를 사용해서 다른 생성자를 호출할 때는 반드시 해당 생성자의 첫 줄에 작성

접근제어자

  • 제어자는 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여해 줍니다.
    -접근 제어자 : public , protected , default , private
    -그 외 제어자 : static , final , abstract

  • 하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있으나, 접근 제어자는 단 하나만 사용할 수 있습니다.

  • 클래스, 멤버변수, 메서드, 생성자에 사용되고, 지정되어 있지 않다면 default 입니다.
    public : 접근 제한이 전혀 없습니다.
    protected : 같은 패키지 내에서, 다른 패키지의 자손클래스에서 접근이 가능합니다
    default : [같은 패키지 내]에서만 접근이 가능합니다.
    private : [같은 클래스 내]에서만 접근이 가능합니다 (보수적)

  • 사용가능한 접근 제어자
    클래스 : public , default
    메서드 & 멤버변수 : public , protected , default , private
    지역변수 : 없음

  • 캡슐화
    접근제어자는 클래스 내부에 선언된 데이터를 보호하기 위해서 사용합니다
    값 유지, 접근 제한

  • 생성자의 접근 제어자
    생성자의 접근 제어자는 클래스의 접근 제어자와 일치합니다

  • Getter 와 Setter 무결성을 유지!!!
    직접적인 값의 조회 세팅 방지 하기 위해 쓴다

    -getter
    외부에서 객체의 private 한 필드를 읽을 필요가 있을 때 Getter 메서드를 사용합니다.

    -setter
    외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때 Setter 메서드를 사용합니다.

package와 import

  • package
    클래스의 일부분이며, 하위 패키지를 도토(.)로 구분한다.

  • import
    패키지를 import로 명시
    서로 다른 패키지에 있는 같은 이름의 클래스를 동시에 사용하려면 해당 클래스에 패키지 명을 전부 명시

클래스간의 관계와 상속

  • 코드의 중복이 제거되고 재사용성이 크게 증가하여 생산성과 유지보수성에 매우 유리
    -클래스간의 상속은 extends 키워드를 사용하여 정의

    public class 자식클래스 extends 부모클래스 {
    }

    -부모클래스에서 자식클래스로 단방향으로 진행
    -자식클래스는 부모클래스에서 받은 것을을 자유자재로 쓸수 있다.

  • 클래스간의 관계
    -상속관계(is) 고래는 포유류 / 스포차카는 자동차
    -포함관계(has) 자동차는 타이어, 차문, 핸들을 가지고 있다

  • 다중산속
    Java는 다중 상속을 허용하지 않는다.

  • final 클래스와 final 메서드 -> 변경 할 수 없다!
    부모 클래스에 final 클래스는 상속 할 수 없다.
    메서드에 final은 오버라이딩 할 수 없는 메소드가 된다.

Object는 최상위 부모 클래스 찾는 메서드

오버라이딩

@ ->애노테이션(annotation) 사용하여 표현

  • 부모 클래스로부터 상속받은 메서드의 내용을 재정의 하는 것을 오버라이딩이라고 합니다.
    -조건

    1. 선언부가 부모 클래스의 메서드와 일치해야 합니다.
    2. 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경할 수 없습니다.
    3. 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없습니다.
  • super 와 super()
    -> this 인스턴스와 this() 생성자와 관련있음 비슷하게 사용
    부모 클래스의 멤버를 참조할 수 있는 키워드
    -자식 클래스의 메서드를 호출하면 super 키워드로 접근한 부모 클래스
    this 키워드로 접근한 자식 클래스 매개변수 값

다형성

참조변수의 타입변환

  • 자동 타입변환
    -부모타입 변수 = 자식타입 객체
    자식 객체는 부모 객체의 멤버를 상속받기 때문에 부모와 동일하게 취급
    작은타입에서 큰타입으로는 안됨

  • 강제 타입변환
    -자식타입 변수 = (자식타입) 부모타입객체;
    -자동형변환이 완료된 상태에서 돌아갈수 있는것만 가능함!

  • 다형성이란
    ‘여러 가지 형태를 가질 수 있는 능력’을 의미합니다
    부모타이어 변수 = 자식타이어객체;

  • instanceof
    의도하는 클래스의 객체인지 확인
    {대상 객체} instance of {클래스 이름}

추상 클래스

  • abstract 키워드 사용 하여 추상 클래스를 선언
  • 부모가 완성시키지 않은 메서드 자식이 상속 받아서 완성 시키는 형태
  • 상속받은 클래스에서 추상 클래스의 추상 메서드는 반드시 오버라이딩 되어야 합니다.
  • 추상 메서드는 블록{ }이 없다.
    즉, 정의만 할 뿐, 실행 내용은 가지고 있지 않습니다.

인터페이스

  • 인터페이스는 두 객체를 연결해주는 다리 역할

  • 상속 관계가 없는 다른 클래스들이 서로 동일한 행위
    즉, 메서드를 구현해야할 때 인터페이스는 구현 클래스들의 동일한 사용 방법과 행위를 보장해 줄 수 있습니다.

    -직접 인스턴스를 생성 할수 없음
    -implements 키워드를 사용하여 인터페이스를 구현할 수 있습니다.
    -추상 메서드는 구현될 때 반드시 오버라이딩
    -인터페이스의 추상 메서드를 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경해야한다.
    -인터페이스간의 상속은 implements 가 아니라 extends 키워드를 사용
    -인터페이스는 다중 상속이 가능하다

  • 디폴트 메서드
    -추상 메서드의 기본적인 구현을 제공 메서드
    -블럭{ }이 존재
    -접근 제어자가 public 이며 생략이 가능
    -추상 메서드가 아니기 때문에 인터페이스의 구현체들에서 필수로 재정의 할 필요는 없습니다.

  • static 메서드
    -한 객체 없이 호출이 가능
    -블럭{ }이 존재

  • 다형성
    -자동 타입변환 인터페이스 변수 = 구현객체;
    -강제 타입변환 구현객체타입 변수 = (구현객체타입) 인터페이스변수;

📝오늘의 회고

화이팅!!! 모르는 내용 더 찾아서 확인해 봐야 할 것으로 보인다.
오늘도! 쳐지지 말고 포기하지말고 힘내서 가보자고~~~

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글