10. static, final, 다형성
가. static
1) static
정지상태, 고정적인, 변화가 없는
'프로그래밍 언어에서' static의 반대말 : dynamic(필요할 때 만들었다가 필요 없을 때 사라지는 것)
2) static member
static variable(정적 변수)
어디서든 공유해서 사용할 수 있는 변수
static method(정적 메서드)
3) static member의 특성
프로그램이 실행되면 메모리(클래스 영역)에 자동으로 로딩됨
프로그램이 끝날 때까지 메모리에 상주함
static method에서는 static member만 사용 가능함
public class Test {
static int a; // static member
int b; // nonstatic member
void print() {
System.out.println(a);
System.out.println(b);
}
public static void main(String[] args) [
System.out.println(a);
// System.out.println(b);
Test t = new Test();
System.out.println(t.b);
}
}
4) dynamic member의 특성
프로그램 실행 중에 필요할 때 만들어지고 필요없으면 삭제됨
stack, heap 영역에 저장됨
10.2 JVM(Java Virtual Machine)의 구조
10.2.1 JVM의 구조
1. Java Source
2. Java Compiler
3. Class Loader : 클래스의 내용을 메모리에 로딩하는 기능
4. Execution Engine : 바이트코드를 해석 기능
5. Runtime Data Area : 운영체제에서 할당받은 메모리 공간
① Class 영역 : method, code, static, constant
② Stack 영역 : method 호출, 지역변수
③ Heap 영역 : 동적 메모리 할당 공간, 인스턴스, 배열
④ Native method 영역 : C언어 함수 공간
⑤ pc register 영역 : 현재 실행중인 부분의 명령어와 주소가 저장
2) Stack 영역
후입선출(Last In First Out)
method 호출, 지역변수 저장 등에 사용되는 메모리 영역
3) Heap 영역
인스턴스, 배열이 저장되는 공간(대용량 메모리 영역)
Garbage Collection의 대상이 되는 영역
(image; heap link)
다. final
'P/G에서 공통적으로 사용되는 값들을 final로 선언해서 사용한다.
1) final이 붙은 요소는 변경할 수 없음
2) final variable
값을 변경할 수 없음(상수)
final int MAX = 100;
3) final method
오버라이딩이 금지됨
class A {
void print() {
System.out.println("a");
}
}
class B extneds A {
@Override
void print() { // overriding : redefined method
// super.print();
System.out.println("b");
}
}
public class Test2 {
public static void main(String[] args) {
B b = new B();
b.print(); // 영역이 겹치면 자기 것이 우선
}
}
4) final class
상속이 금지됨
예) Math, String 클래스
라. 다형성(polymorphism)
'polymorphism은 생물학 용어입니다.
여러 가지 형태를 가질 수 있는 능력
하나의 참조변수로 다양한 자료형의 객체를 참조할 수 있는 것
public class Test3 {
public static void main(String[] args) {
// int a = 10;
// double b = 20;
// char c = 'A';
// String d = "hello";
// Object is a top-level class
// Object a = 10;
// a = 20.5;
// a = 'A';
// a = "hello";
Object a = new Integer(10);
System.out.println(a);
a = new Double(20.5);
System.out.println(a);
a = new Character('A');
System.out.println(a);
a = new String("hello");
System.out.println(a);
}
'로직이 내부적으로 돌아가고 있는 겁니다. Object 타입 하나로 모든 타입을 다 다룰 수 있는데, 이런 걸 다형성이라고 합니다.
실생활의 예 : 마스터 키, 만능 리모컨
부모 클래스의 참조변수로 자식 클래스의 객체를 다룰 수 있는 방법
Object a = 10;
Object a = 100.5;
Object a = true;
(image)
편의상 한곳에 여러 클래스들을 정의하겠습니다.
class Triangle extends Figure {
@Override
void draw() {
System.out.println("삼각형 그리기");
}
}
class Rectangle extends Figure {
@Override
void draw() {
System.out.println("사각형 그리기");
}
}
class Circle extends Figure {
@Override
void draw() {
System.out.println("원 그리기");
}
}
public class Figure {
void draw() {
System.out.println("도형을 그립니다.");
}
public static void main(String[] args) {
// Triangle t = new Triangle();
// t.draw();
// Rectangle r = new Rectangle();
// r.draw();
// Circle c = new Circle();
// c.draw();
Figure f = new Triangle();
f.draw();
f = new Rectangle();
f.draw();
f = new Circle(0;
f.draw();
}
}
10.5 실습예제
1) FinalVar.java 01;16;20
2) FinalClass.java 01;21;27
3) FinalMethod.java 01;22;54
// 오버라이딩: 부모클래스를 상속받아 부모클래스의 메서드를 재정의하는 것
// @Override: annotation, 코드에 대한 주석
4) StaticVar.java
/**
* static: 프로그램이 시작되면 클래스 영역에 자동 로딩
* nonstatic: 인스턴스가 생성될 때 만들어짐
* @author CoRock
*
* cf. 외부 클래스에서 호출할 때는 CLASS_NAME.static member
*/
4) StaticVar.java
5) StaticVar2.java 01;34;36
6) StaticMethod.java 01;44;28
7) StaticExam.java 01;50;31
8) Overload.java 02;02;38
// overload : method 이름은 같고 매개변수는 달라야 함
// 오버로딩(overloading): 같은 클래스 안에서 메서드 이름이 중복된 경우
// 메서드 이름이 같고 매개변수 자료형 또는 개수가 다른 경우
9) OverrideExam.java
// 1 class 1 file이 원칙
// 多 class 1 file → 파일명과 public 클래스 이름이 같아야; public class는 1개만
' class가 1파일에 여러 개 있을 때는 public에 main method를 위치시켜야 합니다.
10) Poly.java 02;20;15