Cute Running Puppy

Language/[Java] 자바 완전 정복

3주차_07. 클래스 내부 구성 요소

R.silver 2022. 2. 3. 19:57
반응형

필드 

클래스에 선언된 변수

필드와 지역 변수

객체의 속성 값을 지정할 수 있는 변수 

cf) 지역변수: 메소드에 포함된 변수

 

  필드 지역 변수
선언 위치 클래스 중괄호 안 메서드 중괄호 안
생성되는 메모리 위치 힙 메모리의 객체 재부 스택 메모리
초기화 초기화 하지 않아도 강제 초기화 직접 초기화 필수

 

Class APPLE {
	int a = 3 // 필드
    
    void eat() {
    	int b = 4; // 지역 변수
        }
    }

메서드

클래스의 기능

 

자바_제어자 리턴_타입 메서드명(입력매개변수) {
    메서드 내용;
}

 

public static int sum (int a, int b) {
	return a + b; 
}

 

여러 리턴 타입의 메서드

//리턴타입: void, 입력매개변수: 없음
void print() {
	System.out.println("hello");
}

//리턴타입: int, 입력매개변수: 없음
int data () {
	return 3;
}

//리턴타입: double, 입력매개변수: 2개
double sum (int a, double b) {
	return a + b;
}

 

메서드 호출하기 

클래스 외부에서 메서드 호출하기 

 

1. 클래스 외부에서 객체 생성하기 

2. 도트연산자를 사용하여 메서드 호출하기 

 

class APPLE { // APPLE 클래스 정의
	void eat() {
    	System.out.println("아삭");
    }
}   
...


//main 함수
pubic static void main(String[] atgs) {

	//객체 생성
    APPLE apple = new APPLE();
    
    //메서드 호출
    a.eat();
}

 

클래스 내부에서 메서드 호출하기 

 

클래스 내부에서는 객체를 생성하지 않고 메서드를 호출할 수 있다. 

(같은 멤버끼리는 클래스 내부에서 객체를 생성하지 않고 호출할 수 있다.)

 

pubilc class Internal {
	public static void main (String[] args) {
		print(); // 같은 클래스 내에 있기에 객체를 생성하지 않아도 된다 
	}
    
    pubic static void print() {
    	Systme.out.prinln("hello");
    }
}

 

입력 매개변수가 배열인 메서드 호출하기 

 

int[] 객체를 생성해서 매개변수로 넘겨주어야 한다. 

 

public static void main(String[] args) {
	// 방법 1
    int[] a = new int[] {1, 2, 3};
    printArray(a);
    
    // 방법 2
    printArray(new int[] {1, 2, 3});
    
    // error
    printArray({1, 2, 3});
	}
    
    public static void printArray(int[] a) {
    	System.out.println(Arrays.toString(a));
    }

 

오버로딩된 메서드

 

입력 매개변수의 개수나 자료형이 다른 여러 개의 동일한 이름을 지닌 메서드를 같은 공간에 정의하는 것 

 

int sum (int a) {
	return a + 3;
}

int sum (int a, int b) {
	return a + b;
}

 

가변 길이 배열 입력 매개변수 메서드 

 

리턴_타입 메서드명 (자료형... 참조_변수명) {
    ...
}

 

public static void main (String[] args) {
	method();
    method(1, 2);
    method(1, 2, 3);
}

public static void method (int... values) {
	for(int i = 0; i < value.length; i++) {
    	System.out.println(value[i] + " ");
        System.out.println();
	}
}

 

가변 길이 배열 입력 매개변수 메서드를 사용하면 오버로딩을 여러 개 만들어야 하는 불편함을 줄일 수 있다. 

생성자

객체를 생성하는 역할을 지닌 클래스의 내부 구성요소 

 

생성자 작성 규칙 

 

1. 반드시 클래스명과 동일한 이름으로 생성자 작성하기 

2. 리턴 타입이 없다 (메서드와 비슷한 모양이므로 주의하기)

 

기본 생성자의 자동 추가 

 

컴파일러는 생성자가 없는 클래스를 만들면 입력 매개변수가 없는 기본 생성자를 자동으로 추가한다. 

 

생성자와 객체의 생성 방법

 

생성자의 모양에 따라 객체를 생성하는 방법이 결정된다. 

생성자도 오버로딩이 가능하다. 

하나의 클래스 안에 다른 내용의 생성자 3개가 오버로딩되어 있다면 클래스로 객체를 만드는 방법이 3가지 존재한다는 것이다. 

 

class A {
	A() {
    	System.out.prinln("첫 번째 생성자");
        }
        
	A(int a) {
    	System.out.prinln("두 번째 생성자");
        }
        
	A(int a, int b) {
    	System.out.prinln("세 번째 생성자");
        }
    }

public class Overloading {
	public static void main (String[] args) {
    	A a1 = new A(); // 첫 번째 생성자 사용
        A a2 = new A(1); // 두 번째 생성자 사용
        A a3 = new A(1, 2); // 세 번째 생성자 사용 
    }
}

this 키워드와 this() 메서드

내부 객체 참조 변수명인 this 키워드 

 

모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 this라는 참조 변수가 있다. 

사실 this 를 사용해야 하지만 컴파일러가 자동으로 추가해줘서 클래스 내부에서 필드와 메서드를 바로 사용할 수 있었던 것이다. 

cf) 지역변수는 멤버가 아니므로 this. 가 자동으로 붙지 않는다. 

 

 

지역 변수와 필드명을 동일하게 설정할 때

넘겨받은 지역 변수를 필드에 대입하기 위해서는 this. 를 붙여야 한다. 

지역 변수와 필드명을 다르게 설정하면 해결되지만 대부분의 자바 API에서 메서드의 지역 변수명이 필드명과 동일하게 구성되어있다. 그러므로 사용 방법을 익히는 것이 좋다. 

 

Class A {
	int m;
    int n;
    void init (int m, int n) {
    
    /* 초기화가 이루어지지 않음
        m = m;
        n = n;
    */
    	//올바를 사용 방법
        this.m = m;
        this.n = n;
    }
}

 

클래스 내 다른 생성자를 호출하는 this() 메서드 

 

자신이 속한 클래스 내부의 다른 생성자를 호출하는 명령

cf) this 키워드: 내부 객체 참조 변수명

class A 안에서 this()는 A() 생성자를 호출하는 것 

생성자의 중복을 제거할 때 사용한다. 

 

class A {
	int a, b, c, d;
    A() {
    	a = 1;
        b = 2;
        c = 3;
        d = 4;
    }
    A(int a) {
    	this(); // A() 생성자 호출 -> 초기화
    	this.a = a;
  	}
    A(int a, int b) {
    	this(); // A() 생성자 호출 -> 초기화
        this.a = a;
        this.b = b;
    }
}

 

this() 메서드 규칙

 

1. 생성자의 내부에서만 사용할 수 있다. 

2. 생성자의 첫 줄에 위치해야 한다. 

 

둘 중 하나라도 지켜지지 않는다면 오류가 발생한다.  

 

 

반응형