클래스와 객체2
이유빈 |
참조 변수와 대입 연산
- 기초 변수와 참조 변수는 대입 연산에서 상당히 다르게 동작함
int x = 10, y = 20;
y =x; //대입 연산
Television tv1 = new Television();
Television tv2 = tv1; //참조 변수
객체의 소멸과 가비지 컬렉션
- 자바에는 객체를 생성하는 연산자는 있지만, 객체를 삭제하는 연산자는 없음
- 자바에서의 자동 메모리 시스템: 가비지 컬렉션
- 가비지 컬렉터
- 히프 메모리에서 더 이상 필요 없는 객체를 찾아 지우는 작업을 함
- JVM의 중요한 부분 대표적으로 오라클의 HotSpot이 있음
- HotSpot은 많은 가비지 컬렉션 옵션을 제공(4개의 가비지 컬렉터)
-
가바지 컬렉션 요청
System.gc() //가비지 컬렉션 요청- 가비지 컬렉터가 수행되면 모든 다른 애플리케이션이 멈춤
- 가비지 컬렉터의 실행 여부는 JVM이 판단
-
가비지 컬렉션을 조정하는 가장 좋은 방법은 JVM을 실행할 때 플래그를 설정하는 것
C> java -XX:+UseParallelGC -jar Application.java
인수전달 방법
- 자바에서 메소드로 인수가 전달되는 방법은 기본적으로 “값에 의한 호출”임
...
int sum = obj.add(25, 47);
...
int add(int x, int y) {
return x+y;
}
- 객체가 전달되는 경우
- 객체를 메소드로 전달하게 되면 객체 자체가 복사되어 전달되는 것이 아니고 객체의 참조값만 복사되어 전달됨
- 참조 변수는 참조값(주소)을 가지고 있음
- 참조값이 매개 변수로 복사되면 메소드의 매개 변수도 동일한 객체를 참조하게 됨
- 배열이 전달되는 경우
- 배열도 객체이기 때문에 배열을 전달하는 것은 배열 참조 변수를 복사하는 것임
정적 멤버
- 여러 개의 객체가 하나의 변수를 공유하는 경우 이러한 멤버를 정적 멤버 또는 클래스 멤버라고 함
- 정적 변수
- 클래스당 하나만 생성되는 변수
-
변수를 정의할 때 앞에 static을 붙이면 됨
/* Television 클래스 부분 */ static int count = 0 /* main 메소드 부분 */ Television.count = 100; //클래스를 통하여 접근 Television obj = new Television(); obj.count = 100; //객체를 통하여 접근 - 주의사항
-
정적 메소드는 정적 멤버만 사용할 수 있음
class Test { int a; // 인스턴스 변수 static int b; // 정적 변수 void sub1() { a = 0; } // OK! static void sub2() { a = 0; } // 오류! 정적 메소드에서는 인스턴스 멤버를 사용하면 안 됨. } -
정적 메소드에서 정적 메소드를 호출하는 것은 가능함
public class Test { public static void main(String args[]) { add(10, 20); //오류! 정적 메소드 안에서 인스턴스 메소드 호출 } int add(int x, int y) { return x + y; } } -
정적 메소드는 this를 사용할 수 없음
class Test { static int a; static void sub(int x) { this.a = x; } //오류! 정적 메소드에서는 this 사용 안 됨 - static 메소드는 인스턴스 변수를 호출할 수 없지만 인스턴스 메소드는 static 변수를 호출할 수 있다.
- static 메소드는 인스턴스 메소드를 호출할 수 없지만 인스턴스 메소드는 static 메소드를 호출할 수 있다.
-
- 정적 메소드
-
정적 메소드도 정적 변수와 마찬가지로 static 수식자를 메소드 앞에 붙여서 만듦
public class Math { public static double sqrt(double a) { ... } } ... double value = Math.sqrt(9.0)
-
final 키워드
- 어떤 필드에 final을 붙이면 상수가 됨
- 상수를 정의할 때 static과 final 수식어를 동시에 사용하는 경우가 많음
public class Car {
static final int MAX_SPEED = 350;
}
정적 블록(static block)
- 클래스가 메모리에 로드될 때 한 번만 실행되는 문장들의 집합
public class TestClass {
static {
System.out.println("test");
}
public static void main(String[] args) {
TestClass a = new TestClass();
TestClass b = new TestClass();
TestClass c = new TestClass();
}
} //test 문장은 한 번만 실행됨
싱글톤 패턴
-
하나의 프로그램 내에서 하나의 인스턴스만을 생성해야 하는 경우에 사용됨
class Single { private static Single instance = new Single(); private Single() { } // 전용 생성자 public static Single getInstance() { return instance; } } public class SingleTest { public static void main(String[] args) { Single obj1 = Single.getInstance(); Single obj2 = Single.getInstance(); System.out.println(obj1); //Single@4926097b System.out.println(obj2); //Single@4926097b } }
객체배열
- 객체를 저장하는 배열
- 객체에 대한 참조값이 저장되어 있음
ArrayList<Book>list = new ArrayList<>();
list.add(new Book(title, score));
댓글