클래스와 객체2

이유빈
이유빈 |
클래스와 객체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));
이유빈

이유빈

국민대학교 소프트웨어융합대학 소프트웨어학부 이유빈입니다. 링크 아이콘을 클릭해 Github 페이지로 이동할 수 있습니다.

댓글

comments powered by Disqus