목차

  1. class 구성 멤버
  2. 인스턴스 멤버와 정적 멤버
  3. final 필드와 상수
  4. 패키지
  5. 접근 제한자 (Access modifer)
  6. 중첩 클래스 (Inner class)
  7. 어노테이션 (Annotation)

1. Class의 구성 멤버

Field

- = 멤버 변수 = 인스턴스 변수

- dot(.) 연산자: 객체 접근 연산자

 

Constructor

new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화 담당

- default constructor: {}, 클래스 내부에 생성자 선언이 없다면 컴파일러가 바이트코드에 자동으로 추가

- 생성자 오버로딩(Overloading): 매개변수를 달리하는 생성자를 여러개 선언하는 것

 

Method

- 메소드가 호출되면 수행에 필요한 메모리를 스택에 할당, 마치면 메모리 반환

- 매개변수: call by value(값을 전달), call by reference(객체 참조 주소 전달)

- 메소드 오버로딩(Overloading): 클래스 내에 같은 이름의 메소드를 여러개 선언하는 것

 

Overloading

 

2. 인스턴스 멤버와 정적 멤버

=> 언제 사용해주면 좋을까?! 객체마다 가지고 있어야 할 데이터라면 instance field, 공용적인 데이터라면 static field

 

인스턴스 멤버와 this

- instance member: 객체(instance)를 생성한 후 사용할 수 있는 필드와 메소드 (instance field, instance method)

- 참조변수 this

: 인스턴스 자신을 가리키는 참조변수
: 인스턴스의 주소가 저장되어 있음

 

정적 멤버와 static

- = 클래스 변수 or 메소드 = 정적 변수 or 메소드 = 공용 변수 or 메소드

클래스에 고정된 멤버. 클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리. 따라서 클래스 로딩이 끝나면 바로 사용 가능

- 클래스이름.필드 or 클래스이름.메소드(매개변수) 로 접근하여 바로 사용

public class 클래스 {
    static 타입 필드;	// 정적 필드
    static 리턴 타입 메소드(매개변수 ...) {...} // 정적 메소드
}

 

- 정적 초기화 블록: 정적 필드 초기화 작업을 위해 제공

static {
....
}

- 정적 메소드나 정적 블록의 내부에는 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다.
-> 사용하고 싶다면 메소드 안에 객체를 먼저 생성하고 참조변수로 접근

 

 

3. final 필드와 상수

- final 필드: 초기값이 저장되면 최종적인 값이 되어 수정할 수 없는 것

- 초기값 주는 방법: 1) 필드 선언시 2) 생성자 호출시

 

- 상수(final static)

: 불변의 값. 객체마다 저장할 필요가 없는 공용성을 띔.

: final만은 상수는 아님. 객체마다 다른 값을 가질 수 있기 때문

: static block으로 초기화 가능

: 상수 이름은 대문자로 작성이 관례

 

 

4.  패키지

- 자바에서는 클래스를 체계적으로 관리하기 위해 패키지(package)를 사용

- 패키지의 물리적인 형태는 파일 시스템 폴더

- 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식.

=> 클래스의 전체 이름: 상위패키지.하위패키지.클래스

- 소문자로 작성하는 것이 관계

 

 

5. 접근 제한자(access modifier)

접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자

 

- public: 접근 제한 없음

- protected: 같은 패키지내에서, 다른 패키지의 자손클래스에서 접근 가능

- default: 같은 패키지내에서만 접근 가능

- private: 같은 클래스내에서만 접근 가능

 

...더보기

제어자의 조합

  1. 메서드에 static과 abstract를 함께 사용할 수 없다.
    - static메서드는 몸통(구현부)이 있는 메서드에만 사용할 수 있기 때문
  2. 클래스에 abstract와 final을 동시에 사용할 수 없다.
    - 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문
  3. abstract메서드의 접근제어자가 private일 수 없다.
    - abstract메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면, 자손클래스에서 접근할 수 없기 때문
  4. 메서드에 private과 final을 같이 사용할 필요 없음
    - 접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문
    - 이 둘 중 하나만 사용해도 의미가 충분.

 

6. Getter와 Setter 메소드

객체지향 프로그래밍에서는 외부에서 직접적으로 객체의 데이터 접근을 막는다.

-> 객체의 무결성(결점이 없는 성질)이 깨질 수 있기 때문. - 매개값을 검증해서 유효한 값만 데이터 저장함.

 

: 메소드를 통해서 데이터 변경 => Getter / Setter

 

 

7. Inner class

: 특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언

: 장점: 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근가능, 코드의 복잡성 줄일 수 있음(캡슐화)

 

특징

  • 클래스 내부에 또 다른 클래스를 가짐으로 클래스 관리의 효율을 높인 것
  • 형식과 생성파일
    - 형식: class Outer { class Inner {...} } 
    - 생성파일) Outer.class, Outer$Inner.class
  • 객체 생성
    - Outer.Inner oi = new Outer().new Inner();
class InnerEx1 {
	class InstanceInner {
    	int iv = 100;
        // static int cv = 100;		// *error! static 변수 선언할 수 없음.*
        final static int CONST = 100;	// *final static은 상수이므로 허용*
    }
    
    static class StaticInner {
    	int iv = 200;
        static int cv = 200;		// *static class만 static 멤버 정의 가능*
    }
    
    void myMethod() {
    	class LocalInner {
        	int iv = 300;
            // static int cv = 300;	// error! static 변수 선언할 수 없음.
            final static int CONST = 300; // final static은 상수이므로 허용
        }
    }
}

 

Anonymous inner class (익명 중첩 클래스)

  • - 기존 클래스의 특정 메서드를 오버라이딩하여 원하는 형태로 재정의하여 사용하는 방식
    - 외부 멤버 중 final만 포함할 수 있음.
  • 형식과 생성파일
    - 형식: class Outer {method() { new Inner() { ... }}}
    - 생성파일: Outer.class, Outer$숫자.class
  • 객체 생성: new Inner() 자체가 객체 생성임.
import java.awt.*;
import java.awt.event.*;

class InnerEx8 {
	public static void main(String[] args) {
    		Button b = new Button("Start");
        	b.addActionListener(new ActionListener() {
        		public void actionPerformed(ActionEvent e) {
            		System.out.println("ActionEvent occured!");
            	}
        	});	// 익명 클래스의 끝
	} // main메서드의 끝
} // InnerEx8클래스의 끝

 

7. 어노테이션(Annotation)

추가예정

 

+ Recent posts