[ KOSTA 교육 15일차 ] OOP 2일차 | static 변수 vs 인스턴스 변수 vs 지역 변수 | 오버로딩 | @Transactional

junjun·2024년 4월 30일
0

KOSTA

목록 보기
13/48

Overloading을 쓰는 이유?

(막연한 질문인 경우,
없으면 뭐가 불편할지를 가정하며 대답하면 잘 대답할 수 있다. )

  • Overloading기능을 지원하지 않았다면,
    비슷한 기능을 하는 메서드들의 이름을 다 다르게 했어야 합니다.

  • 동일한 기능을 하는데 이름이 다르면 사용하기 힘듭니다.

  • 메서드의 이름을 기억하기 쉽고, 사용자 입장에서 사용하기도 쉽고, 관리하기 쉽습니다.

  • 이.타.
    이름이 같고, 타입이 다르면 ( 타입의 종류, 타입의 개수, 리턴 타입은 포함하지 않음 )
    같은 이름으로 메서드를 오버로딩 할 수 있다.

// 컴파일러 입장에서 생각해보자. 구분이 가능할까?

1. 오버로딩 불가 ( 리턴 타입만 다름 )
int add(int a, int b) { return a + b; }
long add(int a, int b) { return (long) (a+b); } // 오버로딩 불가!

2. 오버로딩 가능 ( 타입 순서가 변하면 )
long add(int a, long b) { return a+b; }
long add(long a, int b) { return a+b; }

3. 오버로딩 가능 ( 타입 개수가 변함. )
int add(int a, int b) { return a+b; }
long add(long a, long b) { return a+b; }
int add(int[] a){ return a[0]; } 

생성자 ( Constructor )

[ 면접 질문 ] 생성자란 무엇인가요?

  • 인스턴스가 생성될 때마다 호출되는 ‘인스턴스 초기화 메서드’입니다.
  • 인스턴스를 초기화하기 위해 호출되는 메서드입니다.
  • 일반적으로, 클래스 이름과 동일한 메서드
  • 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 합니다.
    (= 명시적으로 선언된 생성자가 없으면 컴파일러가 기본 생성자를 만들어준다. )
  • 생성자 호출 시, 인스턴스 메서드들도 메모리에 올라온다.
    • 그렇기에, 생성자 내부에서 인스턴스 메서드를 호출할 수 있다.
    • new는 생성자를 호출한다. ( 생성자 호출 키워드가 new )

인스턴스를 생성하면 인스턴스변수들이 만들어지잖아요?

이 인스턴스변수들에 적절한 값을 저장하는 것을 인스턴스 초기화 라고 합니다.

this 키워드

  • 인스턴스 변수, 전역(클래스) 변수와
    지역 변수를 구분해주기 위해 사용하는 키워드
  • 인스턴스의 주소값을 가지고 있습니다.

참조변수 this가 인스턴스변수와 지역변수를 구별하기 위해 사용되었습니다.

인스턴스변수와 지역변수가 이름이 같을 때는 인스턴스변수 앞에 this.를 붙여야 서로 구분이 됩니다.
여기서 this를 붙이지 않는다면... 이름이 같기 때문에...둘 다 지역변수로 간주됩니다.

this()

  • 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
  • 다른 생성자 호출은 생성자의 첫 문장에만 가능하다.
  • this() : 생성자 함수를 가리킨다.
  • ~~new 생성자() 와 같은 표현이지만, 어색하다.~~

초기화 블럭

  • 클래스 변수의 초기화 블럭
    클래스 변수의 복잡한 초기화에 사용하며 클래스가 로딩될 때 실행된다.
    ( jdbc Driver로드 시, Driver가 로드되면서 DriverManager에 등록되는 코드가 있다. )
    - 클래스가 처음 로딩될 때 단 한번

변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화라고 합니다.

  • 인스턴스 변수의 초기화 블럭
  • 생성자에서 공통적으로 수행되는 작업에 사용된다.
    인스턴스가 생성될 때마다 ( 생성자보다 먼저 ) 실행된다.
    - 인스턴스의 생성자가 여러개일 때,
    무조건 공통적으로 실행되어야 하는 기능이 있다면
    초기화 블럭을 사용하는 것이 좋다.

    - 모든 생성자를 위한 전처리에 사용한다. ( 블록 초기화 )
    - 결제 객체를 생성하는데,
    블록 초기화로 결제 결과 로그를 찍어놓는 로직을 쓰면,
    생성자가 실행되어야 결제가 일어나기에, 로그가 생성되지 않는다.
    블록 초기화는 생성자 호출 전에 일어나는 것을 생각해야한다. ( 강사님이 겪은 실제 경험 )

우리가 파일을 삭제해도 파일이 점유하고 있던 저장공간을 지우는 것이 아니라...

다른 파일에 의해서 덮어써지는 것이라는 것을 알고 계실겁니다.

마찬가지로 변수를 선언해서 저장공간이 마련되었을 때...

전에 사용되던 공간을 재활용하는 것일 수 있기기 때문에...

그 저장공간에는 이미 어떠한 값이 저장되어있을 가능성이 높습니다. 이 값을 쓰레기값이라고도 하는데요.

그래서... 변수를 선언한 다음에는... 변수를 적절한 값으로 초기화를 해주는 것이 필요합니다.

그렇지 않으면 쓰레기값이 사용되어서 생각하지 못했던 엉뚱한 결과를 얻을 수 있겠죠.

클래스 변수와 new연산자를 통해서 생성되는... 인스턴스, 배열 은 각 타입의 기본값으로 자동초기화 됩니다.

사실은 이러한 제약... 지역변수는 반드시 초기화를 해주어야 한다는 제약...은

없어도 되는 것이기도 하지만... 개발자의 실수를 줄여주기 위해서 만들어진 것입니다.

항상 클래스 초기화가 인스턴스 초기화 보다 먼저 수행되고...

기본값, 간단한 초기화 , 복잡한 초기화... 의 순서로 초기화가 수행되고...

인스턴스 초기화의 마지막으로는 생성자가 호출된다는거... 잘 기억해주시기 바랍니다.

0개의 댓글