개발로드

★KDT 2024-01-23☆상속, static, 싱글톤, 정적 초기화 본문

JAVA

★KDT 2024-01-23☆상속, static, 싱글톤, 정적 초기화

위대한개발자 2024. 1. 23. 12:36
상속(extends)

 

  • 상속은 부모클래스를 재사용해서 새로운 클래스를 만들어서 코드의 중복을 줄여준다.
  • 자식 클래스를 하위클래스, 부모 클래스를 상위 클래스라고 부른다

☆자바의 상속  특징

  1. 부모 클래스를 여러개 상속할 수 없다
  2. private 접근 제한을 가진 부모클래스의 필드와 메소드는 상속대상에서 제외된다.

extends 예시

 

자동 타입변환

자식객체는 부모타입으로 변환이 가능하지만, 부모객체는 자식타입으로 변환이 불가능하다!
why? heap에는 완성된 객체가 올라가야 하는데 부모객체는 자식타입의 객체보다 멤버수가 적어서 자식타입의 멤버를 채 워줄 수가 없어서 에러가 발생한다.

 

 

★필드(field)
  

  1. 메소드의 내부(지역변수)를 제외하고 클래스 내부의 어디에서든 선언할 수 있다
  2. 지역변수는 매개변수나 메소드 내부에서 선언된 변수,for문, while문, if문등 블록내부에서도 지역 변수를 선언할 수 있다
  3. 필드 선언시 초기화하지 않아도 기본값으로 자동 초기화된다.
  4. 지역변수는 기본값이 없기 때문에 반드시 초기화 해야 한다
  5. 필드는 클래스 전체에서 사용할 수 있다
  6. 지역변수는 선언된 후부터 선언된 블록({}) 내부에서만 사용할 수 있다
  7. 필드는 모든 접근 지정자뿐만 아니라 static, final로 지정할 수 있다

☆this

  1. 자기자신 객체 참조변수,  자신이 참고하는 객체의 주소, 명확하게 멤버라는 것을 제시하고자 할때 사용

★this()

  1. 자신의 다른 생성자를 호출 반드시 첫 줄에 사용한다

☆ 생성자

  1. new 연산자를 이용해서 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다

★ 객체의 초기화

  1. 필드를 초기화하거나(사용할 수 있게 준비시킨다) 메소드를  호출해서 객체를 사용할 준비를 하는 것
  2. 생성자를 사용하지 않고는 클래스로부터 객체를 만들 수 없다

☆ 오버로딩(overloading)

  1. 매개변수의 개수와 매개변수의 타입이 다른 것
  2. 생성자 오버로딩: 생성자 이름이 같고, 매개변수의 개수나 매개변수의 타입이 다른 것
  3. 메소드 오버로딩 : 메소드 이름이 같고, 매개변수의 개수나 매개변수의 타입이 다른 것 리턴타입은 의미가 없음

★메소드 선언

[접근제한자] 리턴타입 메소드명(매개변수,...){     // 선언부(메소드 시그너처(signature))
      메소드를 실행할 코드(문장)              // 구현부, 메소드 실행 블록,  body
   }

 

  1. 리턴 타입 : 메소드가 리턴하는 결과의 타입을 표시
  2. 메소드 이름 : 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름을 지어줌
  3. 매개 변수 선언 : 메소드를 실행할 때 필요한 데이터를 받기 위한 변수를 선언
  4. 메소드 실행 블록 : 실행할 코드 작성

☆static 제어자★

★정적(static) 멤버

  1. 앞에 static이 붙은 멤버 객체 생성없이 '클래스명.멤버명'으로 바로 사용
  2. 클래스 변수(정적변수) : 클래스 내부에 생성, 객체간 공유 변수
  3. 정적(static) 메서드 내부에서는 정적(static) 멤버만 사용 가능하며, 클래스 내부에서 자신의 객체를 가리키는 this키워드 사용할 수 없음.

☆인스턴스 멤버 & 정적 멤버

  1. 인스턴스 멤버 : 객체 생성과 함께 만들어진다.  '참조변수명.인스턴스 멤버명' 멤버의 저장 공간이 객체 내부 즉 힙영역에 생성(객체에 만들어진다)
  2. 정적(static) 멤버 : 저정 공간이 클래스 내부 즉 class 영역(정적영역, 메서드 영역, 데이터영역)에 생성

★정적 초기화 블록  

  1. 인스턴스 필드의 초기화는 객체를 생성하는 시점에 이루어진다.
  2.  즉 객체가 생성자에 의해 초기화 되므로 생성자 내에서 인스턴스 필드를 초기화 해준다.
  3. 그러나 정적필드는 객체 생성 이전에 사용할 수 있어야 하므로 생성자가 호출되지 않은 상태에서도 초기화 할 수 있어야 함
  4.  (즉 생성자에서는 정적 필드를 초기화 할 수 없음)
  5. 정적 필드는 정적 초기화 블록(static { } )에서 초기화 해 주어야 함
  6. 정적초기화 블록은 클래스가 메모리에 로딩될 때 가장 먼저 실행되므로 정적 필드의 초기화 코드를 넣어  주면 클래스가 로딩되는 시점에 바로 초기화

☆main()메서드 

  1. 자바 가상 머신(jvm)은 프로그램을 실행할 때 '실행 클래스명.main()'을 실행하므로 가장 먼저 실행되는 메서드인 main()메서드를 정적 메서드로 구성 

★변수 유형에 따른 용도☆

  1. 지역변수(=local variable)  메소드 등의 내부에 선언
             스택영역에 위치(메소드를 호출하는 시점에 스택영역에 올라감)
             메소드의 실행이 끝나면 메모리에서 소멸
             메소드가 호출 될때 실행되고 메소드 실행이 끝나면 소멸
  2. 인스턴스 변수  : 클래스에서 필드로 선언되어 있으며,
             객체(인스턴스) 내부에 생성되며, heap 영역에 위치
  3. static변수(=클래스 변수, 정적변수) : static 예약어를 사용하여 클래스 내부에 선언
             클래스 내부에 위치
             객체들이 공유하는 변수
             메소드 영역(=데이터영역,=클래스영역)에 위치하며 프로그램이 끝나고 
                                               메모리를 해제할 때 소멸됨

☆싱글톤(singleton) 패턴 ★

애플리케이션 전체에서 단 한 개의 객체만 생성
 핵심 : 생성자를 private 접근 제한자로 제한해서 외부에서 
  new 연사자로 생성자를 호출할 수 없도록 막는 것
 외부에서 맘대로 객체를 생성하는 것이 불가능
 정적 메소드를 이용해서 외부에서 간접적으로 객체를 사용 

 

 



'JAVA' 카테고리의 다른 글

★KDT 2024-01-25☆추상 클래스  (0) 2024.01.25
☆KDT 2024-01-24★클래스 상속, 다형성,캐스팅  (0) 2024.01.24
☆KDT 2024-01-22★  (0) 2024.01.22
★KDT 2024-01-19☆  (0) 2024.01.19
☆KDT 2024-01-18★  (0) 2024.01.18