목차
- class 구성 멤버
- 인스턴스 멤버와 정적 멤버
- final 필드와 상수
- 패키지
- 접근 제한자 (Access modifer)
- 중첩 클래스 (Inner class)
- 어노테이션 (Annotation)
1. Class의 구성 멤버
Field
- = 멤버 변수 = 인스턴스 변수
- dot(.) 연산자: 객체 접근 연산자
Constructor
new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화 담당
- default constructor: {}, 클래스 내부에 생성자 선언이 없다면 컴파일러가 바이트코드에 자동으로 추가
- 생성자 오버로딩(Overloading): 매개변수를 달리하는 생성자를 여러개 선언하는 것
Method
- 메소드가 호출되면 수행에 필요한 메모리를 스택에 할당, 마치면 메모리 반환
- 매개변수: call by value(값을 전달), call by reference(객체 참조 주소 전달)
- 메소드 오버로딩(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: 같은 클래스내에서만 접근 가능
제어자의 조합
- 메서드에 static과 abstract를 함께 사용할 수 없다.
- static메서드는 몸통(구현부)이 있는 메서드에만 사용할 수 있기 때문 - 클래스에 abstract와 final을 동시에 사용할 수 없다.
- 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문 - abstract메서드의 접근제어자가 private일 수 없다.
- abstract메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면, 자손클래스에서 접근할 수 없기 때문 - 메서드에 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)
추가예정
'Java' 카테고리의 다른 글
[Java] Collection framework (0) | 2019.08.29 |
---|---|
[Java] 추상 클래스(abstract class)와 인터페이스(interface) (0) | 2019.08.29 |
[Java] 상속 (inheritance) 정의 / final 클래스와 메소드 / instanceof 연산자 (0) | 2019.08.28 |
[Java] Data Type - 기본타입 / 참조타입 (0) | 2019.08.27 |
[Java] JDK, JVM 용어 정리 및 프로그램 실행 단계 (0) | 2019.08.27 |