반응형

<객체 배열>

- 자바의 객체 배열은 객체에 대한 레퍼런스를 원소로 갖는 배열이다.

 5개의 Circle 객체들을 원소로 저장하는 배열을 만든 사례 ↓

Circle [] c; //Circke 배열에 대한 레퍼런스 변수 c선언
c = new Circle[5]; // 레퍼런스 배열 생성

for(int i=0; i<c.length; i++) // c.length는 배열 c의 크기로서 5
	c[i] = new Circle(i); //배열의 각 원소 객체 생성

배열에 들어있는 모든 Circle 객체의 면적을 출력하는 코드 사례 

for(int i=0; i<c.length; i++) // 배열에 있는 모든 Circle 객체의 면적 출력
	System.out.print((int)(c[i].getArea()) + " " ); 
    				//c[i].getArea() => 배열의 원소 객체 사용.

 

<배열 선언 및 생성>

1. 배열에 대한 레퍼런스 선언

Circle [] c;	//Circle클래스의 배열에 대한 레퍼런스 변수 c선언

c = new Clrcle[5];	//Circle 객체에 대한 레퍼런스 5개 생성

for(int i=0; i<c.lenth; i++)	// c.length는 배열 c의 크기로서 5.
	c[i] = new Circle(i);	// i 번째 circle 객체 생성

<배열의 원소 객체 접근>

배열  c의 i번째 객체에 접근하기 위해서는  c[ i ] 레퍼런스를 사용하면 된다. 

for(int i=0; i<c.lenth; i++)
	System.out.print((int)(c[i].getArea()) + " " );

위 코드는 배열 c에 들어잇는 모든 Circle 객체의 면적을 출력한다.

 

<메소드 활용>

<메소드 형식>

- 메소드는 클래스의 멤버 함수로서 메소드 앞에 접근 지정자를 선언한다는 점을 제외하면  C/C++의 함수 작성법과 동일하다. 접근 지정자는 public, priavte, protected, 디폴트4가지 유형으로, 메소드가 다른 클래스에서 호출될 수 있는지 지정하기 위해 사용한다.

 

<인자 전달>

- 자바의 메소드 호출 시 인자 전달 방식(argument passing)은 '값에 의한 호출'(call-by-value)이다. 

1. 기본 타입의 값이 전달되는 경우

-  메소드의 매개변수가 기본타입(byte, char, short, int, long, float, double, boolean)으로 선언된 경우 호출자가 건네는 값이 매개변수에 복사되어 전달된다.  즉, 메소드의 매개 변수가 설정되어도 호출한 실인자 값은 변경되지 않는다.

 

2. 객체가 전달되는 경우

- 메소드의 매개변수가 클래스 타입인 경우, 객체가 아니라 객체의 레퍼런스 값이 전달된다. 메소드 호출 시 객체가 전달되는 경우, 객체에 대한 레퍼런스만 전달되지 객체가 통째로 복사되지 않는다.

3. 배열이 전달되는 경우

- 배열이 메소드에 전달되는 경우도 배열이 통째로 전달되는 것이 아니며 배열에 대한 레퍼런스만 전달된다. 메소드의 배개변수와 호출한 실인자 객체가 하나의 배열을 공유하게 되는 것이다.

 

<메소드 오버로딩>

-  메소드 오버로딩이란 한 클래스 내에 이름이 같지만 매개변수 타입이나 개수가 서로 다른 여러개의 메소드를 중복 작성하는 것을 말한다. 여러 개의 메소드가 오버로딩 되려면 아래와 같은 조건을 모두 만족해야 한다.

· 메소드 이름이 동일하여야 한다.
· 메개 변수나 개수나 타입이 서로 달라야 한다.
· 메소드의 리턴 타입이나 접근 지정자는 메소드 오버로딩과 관계없다.

1. 메소드 오버로딩 성공 사례

- getSum( ) 으로 2개의 메소드의 이름이 동일하지만 매개변수의 개수가 서로 다르기 때문에 오류없이 사용 할 수 있다.

class MethodOverloading{
	public int getSum(int i , int j){
    	return i + j;
    }
     public int getSum(int i, int j, int k){
     	return i + j + k;
     }
}

2. 메소드 오버로딩 실패 사례

- getSum( ) 메소드와 매개 변수의 개수, 타입이 모두 같아서 호출자의 입장에서 구분하기 어려워 오류를 발생하므로 메소드 오버로딩이 실패되었다. 

class MethodOverloadingFail{
	public int getSum(int i , int j){
    	return i + j;
    }
     public int getSum(int i, int j){
     	return (double)i + j;
     }
}

3. 오버로딩된 메소드 호출

 

<객체의 소멸과 가비지 컬렉션>

<객체의 소멸>

- 객체 소멸이란 new에 의해 생성된 객체 공간을 자바 가상 기계에 돌려주어 가용 메모리(available memory)에 포함시키는 것이다.

 

<가비지>

- 가비지(garbage)란 자바 응용프로그램에서 더 이상 사용되지 않게 된 객체나 배열 메모리이다. 자바 플랫폼은 참조하는 레퍼런스가 하나도 없는 객체나 배열을 더 이상 응용프로그램이 접근할 수 없으므로 가비지로 판단한다.

person a, b;
a = new person("흥부");
b = new person("놀부");
b = a;

레퍼런스 b는 a가 가리키던 객체(흥부)를 가리키게 되고, b가 가리키던 처음 객체(놀부)는 아무도 참조하지 않게 되어 더 이상 접근할 수 없게 되었다. 이 b객체(놀부)가 바로 가비지이다.

 

<접근 지정자>

<패키지>

- 자바는 서로 관련 있는 클래스 파일들을 패키지(package)에 저장하여 관리하도록 한다. 패키지는 디렉토리 혹은 폴더와 같은 개념이며, 개발자는 클래스 파일들을 여러 패키지에 분산 관리하는 것이 일반적이다.

 

<자바의 4가지 접근 지정자>

· private, protected, public, 접근 지정자 생략(디폴트 접근 지정)

 

<클래스 접근 지정>

- public 클래스 : 클래스 이름 앞에 public으로 선언된 클래스로 패키지에 상관없이 다른 어떤 클래스에게도 사용이 허용됨.

- 디폴트 클래스(접근 지정자 생략0) : 접근 지정자 없이 클래스를 선언한 경우 디폴트(default) 접근 지정으로 선언되었다고 한다. 디폴트 클래스는 같은 패키지 내의 클래스에게만 사용이 허용됨.

 

<멤버 접근 지정>

· public 멤버

public 멤버는 패키지를 막론하고
모든 클래스들이 접근이 가능하다.

· protected 멤버

protected 접근 지정자는 보호된 공개를 지시하는 것으로
같은 패키지의 모든 클래스에 접근이 허용되고
다른 패키지에 있더라도 자식 클래스의 경우 접근이 허용된다.

· 디폴트 멤버

접근 지정자가 생략된 멤버의 경우
디폴트(defualt) 멤버라고 한다.
동일한 패키지 내에 있는 클래스들만 자유롭게 접근 가능하다.

· private 멤버

private 접근 지정자는 비공개를 지시하는 것으로, 
같은 클래스 내의 멤버들에게만 접근이 허용된다.

 

<static 멤버>

<static 멤버의 선언>

class StaticSample{
	int n;			//non-static필드
    void g(){...}		//non-static 메소드
    
    static int m ;		// static 필드
    static void f(){...}	//static 메소드    
}

<non-static 멤버와 static 멤버의 차이점>

  non-static 멤버 static 멤버
선언 class Sample {
     int n ;
     void g( ) {...}
}
class Sample {
     static int m ;
     static void f( ) {...}
}
공간적 특성 멤버는 객체마다 별도 존재
· 인스턴스 멤버라고 부름
멤버는 클래스당 하나 생성
· 멤버는 객체 내부가 아닌 별도의 공간(클래스 코드가 적재되는 메모리)에 생성
· 클래스 멤버라고 부름
시간적 특성 객체 생성 시 멤버도 생성됨
· 객체가 생길 때 멤버도 생성
· 객체 생성 후 멤버 사용 가능
· 객체가 사라지면 멤버도 사라짐
클래스 로딩 시에 멤버 생성
· 객체가 생기기 전에 이미 생성
· 객체가 생기기 전에도 사용 가능
· 객체가 사라져도 멤버는 사라지지 않음
· 멤버는 프로그램이 종료될 때 사라짐
공유의 특성 공유되지 않음
· 멤버는 객체 내에 각각 공간 유지
동일한 클래스의 모든 객체들에 의해
공유됨.

 

<final 클래스>

- final이 클래스 이름 앞에 사용되면 클래스를 상속받을 수 없음을 지정한다.

final class FinalClass{			// 이 클래스는 상속 불가
		....
}

 

<final 메소드>

- final로 메소드를 선언하면 자식 클래스가 부모 클래스의 특정 메소드를 오버라이딩 하지 못하게 하고 무조건 상속받은 그대로 사용해야 한다.

public class SuperClass{
	protected final int finalMethod(){...}	//finalMethod()는 자식이 오버라이딩 불가
}

 

<final 필드> 

- final로 필드를 선언하면 필드는 상수가 된다. 상수 필드는 한번 초기화되면 값을 변경할 수 없다. final 키워드를 public static과 함께 선언하면, 프로그램 전체에서 사용할 수 있는 상수가 된다.

class SharedClass{
	public static final double PI = 3.14;
}

SharedClass 내에서는 다음과 같이 그냥 PI로 사용되지만,

double area = PI*rdius*radius;

다른 클래스에서는 다음과 같이 사용하면 된다.

double area = SharedClass.PI*radius*radius;

 

반응형

+ Recent posts