TIL

[TIL] Java Final 상수, 접근 제한자, 싱글톤 패턴, 상속, super(), 메서드 오버라이딩, 상속 클래스 타입 변환, 메서드 오버라이딩 예외

thegreatjy 2023. 10. 11. 20:25
728x90

Final 상수

static final VARIABLE

기호 상수

프로그램 실행 도중에 수정 불가능

접근 제한자

접근 제한자를 이용하여 객체의 필드를 외부에서 변경하거나 메서드를 호출할 수 없도록 한다.

중요한 필드(변수)와 메서드를 외부로 노출시키지 않도록 만들어 객체의 무결성(결점이 없는 성질)을 유지한다.

접근 제한자 제한 대상 제한 범위
public 필드, 생성자, 메서드, 클래스 없음
protected 필드, 생성자, 메서드 같은 패키지, 자식 객체
default 필드, 생성자, 메서드, 클래스 같은 패키지
private 필드, 생성자, 메서드 객체 내부

클래스 접근 제한 : public, default

  • public : 다른 클래스에서도 클래스 접근 가능
  • default : 같은 클래스에서만 클래스 접근 가능

싱글톤 패턴

private 생성자(){}

어플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶을 때, 싱글톤 패턴을 적용한다.

생성자를 private 접근 제한하여 외부에서 new 연산자(객체를 생성)로 생성자를 호출할 수 없도록 한다.

class Singleton{
    private static Singleton singleton = new Singleton();

    private Singleton(){};

    public static Singleton getInstance(){
        return singleton;
    }
}

public class SingletonExample {
    public static void main(String[] args) {
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();

        if(obj1.equals(obj2)){
            System.out.printf("같은 singleton 객체입니다."); //출력됨
        }else{
            System.out.printf("다른 singleton 객체입니다.");
        }
    }
}

상속

super()

부모의 기본 생성자를 호출한다.

부모의 기본 생성자가 존재하지 않으면 컴파일 에러가 발생한다.

컴파일 과정에서 자동으로 추가된다.

자식 생성자의 맨 첫 줄에 숨겨져 있다.

메서드 오버라이딩

상속된 메소드를 자식 클래스에서 재정의하는 것

  • 부모 메서드의 선언부(리턴타입, 메서드 이름, 매개변수)가 동일해야 한다.
  • 접근 제한을 더 강하게 오버라이딩할 수 없다. (public → private 불가능)
  • 새로운 예외를 throw할 수 없다.

메서드 오버라이딩에서의 예외

  1. 상위클래스의 메서드에서 throws를 선언했더라도 하위클래스는 throws 처리를 하지 않을 수 있다.

     class Parent {
         public void methodA() throws IOException, SQLException {
         }
     }
    
     class Child extends Parent {
         public void methodA() {
         }
     }
  2. 하위클래스는 상위클래스의 메서드에서 throws 하는 예외와 같은 예외를 throws 할 수 있다.

     class Parent {
         public void methodA() throws IOException, SQLException {
         }
     }
    
     class Child extends Parent {
         public void methodA() throws SQLException {//IO 혹은 SQL 예외만 선언 가능
         }
     }
  3. 하위클래스는 상위클래스의 메서드에서 throws 하는 예외의 하위 예외만 throws 할 수 있다.

     class Child extends Parent {
         // IOException, SQLException 보다 상위예외이므로 X
       public void methodA() throws Exception {}  
    
     // ZipException과 XmlStreamReaderException는 IOException를 상속받은 하위 예외
         public void methodA() throws ZipException, XmlStreamReaderException, SQLException {}
     }
  4. 하위클래스는 Runtime 예외(Unchecked) 예외를 상위클래스의 메서드와 관계없이 throws 할 수 있다.

    RuntimeException과 그 하위 예외들은 상위 클래스와 관계 없이 하위 클래스에서 throws 할 수 있습니다

     public void methodA() throws RuntimeException {}

Protected 접근 제한자

접근 제한자 제한대상 제한 범위
protected 필드, 생성자, 메서드 같은 패키지, 자식 객체

멤버, 필드

멤버 = 필드(변수) + 메서드 + 생성자

클래스 타입 변환

자동 타입 변환

부모 타입 변수 = 자식 타입 객체

부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드(변수)와 메서드만 접근 가능하다.

변수는 자식 객체의 변수를 참조하지만, 변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정된다.

자식 클래스에서 오버라이딩된 메서드가 있다면 부모 메서드 대신 오버라이딩된 메서드가 호출된다. ⇒ 다형성

Class Cat extends Animal
Class WhiteCat extends Cat
Class Dog extends Animal

Animal a = new Cat(); // 가능
Animal b = new WhiteCat(); // 가능
Cat c = new WhiteCat(); // 가능 
Cat c = new Dog(); // 불가능

강제 타입 변환

자식 타입 변수 = (자식 타입) 부모 타입 객체

자식 객체가 부모 타입으로 자동 변환된 후, 다시 자식 타입으로 변환할 때, 강제 타입 변환을 사용할 수 있다.

Parent p = new Child();
Child c = (Child)p;

자식 타입에 선언된 필드(변수)와 메서드를 꼭 사용해야 할 때, 강제 타입 변환으로 다시 자식 타입으로 변환한다.


Refs

margin

https://www.tcpschool.com/css/css_boxmodel_margins

필드, 멤버

https://kephilab.tistory.com/46

메서드 오버라이딩 예외

https://dololak.tistory.com/609

728x90