본문 바로가기

KOSTA : 클라우드 네이티브 애플리케이션 개발 전문가 양성과정

05/02 16일차 객체지향언어I : 생성자, 변수의 초기화

728x90

Lec06생성자.java
0.00MB

기본형 매개변수와 참조형 매개변수

- 기본형 매개변수 : 변수의 값을 읽기만 할 수 있습니다.

- 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있습니다.

 

재귀호출

- 매서드내에서 자기 자신을 반복적으로 호출할 수 있습니다.

- 재귀호출은 반복문으로 바꿀 수 있으며, 반복문보다 효율이 낮습니다.

- 팩토리얼, 제곱, 폴더 목록 표시 등에 사용됩니다.

int Factorial(int n){
	if(n==1)
    	return 1;
    return n*Factorial(n-1);
}

 

멤버간 참조와 호출

- 같은 클래스간에는 객체생성이나 참조변수 없이 참조할 수 있다. 그러나 static 멤버들은 instance 멤버들을 참조할 수 없습니다.

class Test{
	void instanceMethod(){};
    static void classMethod(){};
    
    void instanceMethod2(){
    	instanceMethod();
        classMethod();
    }
    
    static void classMethod2(){
    	instancceMethod(); // err
        classMethod();
    } 
}

 

class Test{
	int iv;
    static int cv;
    
    void instanceMethod(){
    	System.out.println(iv);
        System.out.println(cv);
    }
    
    static classMethod(){
    	System.out.prtinln(iv); // err
        System.out.println(cv);
    }
}

 

오버로딩

- 하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩이라고 합니다.

- 메서드 이름이 같아야 합니다. (조건)

- 매개변수 개수 또는 타입이 달라야 합니다. (조건)

 

생성자(Constructor)

- 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드' 입니다. (역할)

- 변수의 초기화 또는 인스턴스 생성시 수행할 작업에 사용됩니다. (역할)

- 모든 클래스에는 생성자가 존재합니다.

- 리턴이 없어도 void 타입을 적지 않습니다. (일반 메서드와의 차이점)

 

this

- 생성자를 호출 후에 만들어진 주소를 지칭하는 키워드입니다.

- 실행시 메모리에 바로 올라갈 static 메서드안에서는 실행되지 않습니다.

- 생성자함수안에서는 사용 가능합니다. 단 첫줄에 입력해야 합니다.

 

변수의 초기화

- 지역변수 : 초기화가 필수입니다.

- 전역변수 : 초기화하지 않으면 컴파일 시 기본값으로 입력됩니다.

class InitTest{
	int x;
    int y = x;
    
    void method(){
    	int i;
        int j = j // err 지역변수를 초기화하지 않고 사용했음
    }
}

 

멤버변수의 초기화

class InitTest{
	
    static int cv = 1; // 명시적 초기화
    int iv = 1; // 명시적 초기화
    
    static { cv = 2;} // 클래스 초기화 블럭
    {iv = 2;}
    
    InitTest(){
    	iv = 3; // 생성자
    }
    
}

 

 

 

메서드를 호출할 때 파라미터를 전달하는 방법

- Call by Reference는 참조를 직접 넘기기 때문에 호출자의 변수와 수신자의 파라미터는 완전히 동일한 변수입니다.

메서드 내에서 파라미터를 설정하면 그래도 원본 변수에도 반영됩니다.

- Call By Value는 메서드를 호출하는 변수와 수신자의 파라미터는 복사된 서로 다른 변수입니다.

값만을 전달하기 때문에 수신자의 파라미터를 수정해도 호출자의 변수에는 아무런 영향이 없습니다.

- Java는 오직 Call By Value로만 전달됩니다.

 

원시타입전달

class PrimitiveTypeTest{
	void test(){
    	int a = 1;
        int b = 2;
        
        //before
        assertEquals(a,1);
        assertEquals(b,2);
        
        modify(a,b);
        
        //after :  modify(a,b)이후에도 값이 변하지 않음
        assertEquals(a,1);
        assertEquals(b,2);
        
    }
    
    private void modify(int a, int b){
    	a = 5;
        a = 10;
    }
}

 

 

참조타입전달

class User{
	public int age;
    
    public User(int age){
    	this.age = age;
    }
}

public class ReferenceTypeTest{
	void test{
    	User a = new User(10);
        User b = new User(30);
        
        //before
        assertEquals(a.age,10);
        assertEquals(b.age,30);
        
        modify(a,b);
        
        //after 
        assertEquals(a.age,11);
        assertEquals(b.age,20);
    }
    
    private void modify(User a, User b){
    	
        // modify의 a와 test의 a는 같은 객체를 바라봐서 영향이 있음
        a.age++;
        
        // b에 새로운 객체를 할당하면 가리키는 객체가 달라지고 원본에는 영향이 없음
        b = new User(30);
        b.age++;
    }
}

 

처음 변수 선언시 메모리 상태
modify(a,b) 호출 시점의 메모리 상태
modify(a,b) 수행 직후 메모리 상태
test() 끝난 후 메모리 상태

 

Lec06생성자.java
0.00MB