메서드에 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클래스의 끝
int Type - 변수에 어떤 진수(10,8,16진수)를 입력하더라도동일한 값이 2진수로 변환되어 저장
long Type - 수치가 큰 데이터를 다루는 프로그램에서 필수적 - 변수 초기화: 정수값 뒤에 l 또는 L 붙임.
실수 타입
float과 double의 메모리 사용 크기는 각각 int와 long의 크기와 같지만, 정수 타입과는다른 저장 방식 때문에 훨씬 더 큰 범위의 값을 저장할 수 있음.
자바의 실수 리터럴의 기본 타입: double
타입 변환 (Type Casting)
자동 타입 변환 (promotion) : 큰 크기 타입 <- 작은 크기 타입 (메모리 크기) - byte(1) < short(2) < int(4) < long(8) < float(4) < double(8) float가 뒤인 이유?! 표현할 수 있는 값의 범위가 float이 더 크기 때문 - char type의 경우 int type으로 자동 변환. but! 음수 저장이 안되므로 byte타입은 자동 변환 안됨.