본문 바로가기

프로그래밍/Java

Java_객체지향언어(3)_static메서드와 인스턴스메서드, 오버로딩, 생성자, 참조변수 this, 생성자 this()

반응형

① static메서드와 인스턴스 메서드

- 인스턴스 메서드 

  → 인스턴스 생성 후, '참조변수.메서드이름()'으로 호출

  → 인스턴스 멤버와 관련된 작업을 하는 메서드

  → 메서드 내에서 인스턴스 변수 사용 가능

- static 메서드(클래스 메서드)

  → 객체생성없이 '클래스이름.메서드이름()'으로 호출 

  → 인스턴스 멤버와 관련없는 작업을 하는 메서드

  → 메서드 내에서 인스턴스 변수 사용 불가

 

class MyMath2{
    long a, b		//인스턴스 변수 
    
    long add() {	//인스턴스 메서드
    	return a+b;	//인스턴스 변수
    }
    static long add(long a, long b) {	//static 메서드
    	return a+b;	//지역변수 
    }
}

class MyMath2{
	public static void main(String args[]) {
    	System.out.println(MyMath2.add(200L, 100L);	//static 메서드는 객체 생성없이 호출 가능.
        
        MyMath2 mm=new MyMath2();	//객체 생성
        mm.a=200L;
        mm.b=100L;	//인스턴스 변수
        System.out.println(mm.add());	//인스턴스 메서드 호출
    }
}

결과 
300
300

 

 

② 메서드 간의 호출과 참조

- static 메서드가 static 메서드 호출 가능한가 ? 네.

- static 메서드가 인스턴스 변수 사용 가능한가 ? 아니요.

- static 메서드가 인스턴스 메서드 호출 가능한가? 아니요.

- 왜 static 메서드는 인스턴스 멤버를 사용할 수 없나? static 메서드 호출 시 객체가 없을 수도 있어서. 

 

 

③ 메서드 오버로딩

: 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 오버로딩이라 한다. 

- 오버로딩의 성립 조건

→ 메서드 이름이 같아야 한다. 

→ 매개변수의 개수 또는 타입이 달라야 한다. 

→ 반환타입은 관계없다.

// 중복 정의, 오버로딩 X
int add(int a, int b) {return a+b;}
int add(int x, int y) {return x+y;}	

// 중복 정의, 오버로딩 X
int add(int a, int b) {return a+b;}
long add(int a, int b) {return (long)(a+b);}

// 오버로딩 O
long add(int a, long b) {return a+b;}
long add(long a, int b) {return a+b;}

 

 

④ 생성자

: 생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. (인스턴스 변수 초기화 작업에 주로 사용된다.)

-  생성자의 조건
→ 생성자의 이름은 클래스의 이름과 같아야 한다.

→ 생성자는 리턴 값이 없다. 

Timte t= new Time();	//기본 생성자 
t.hour = 12;
t.minute = 34; 
t.second = 45;		//인스턴스 변수 초기화

Time t= new Time(12, 34, 45);	//생성자 호출

 

⑤ 기본 생성자

: 매개변수가 없는 생성자

클래스이름() {}		//기본 생성자
Time() {}		//Time클래스의 기본 생성자

 

class Data_1 {
        int value;	//컴파일러가 자동으로 생성자를 넣어줌
}

class Data_2 {
	int value;	//Data_2() {} 기본 생성자를 추가해야 함. 
    
	Data_2(int x) {
    	value = x;
    }
}

class Ex6_11 {
    public static void main(String[] args) {
    	Data_1 d1 = new Data_1();
        Data_2 d2 = new Data_2();	//compie error 발생
    }
}

→ 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이라서

class Data_2에 기본 생성자를 추가해야 함. 

 

 

 

⑥ 매개변수가 있는 생성자 

: 생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다. 

(인스턴스마다 각기 다른 값으로 초기화되어야 하는 경우가 많기 떄문에 매개변수를 사용한 초기화를 사용한다.)

class Car{
    String color;
    String gearType;
    int door;
    
    Car() {}	//기본 생성자
    
    Car(String c, String g, int d) {	//매개변수가 있는 생성자
    	color = c;
        gearType = g;
        door = d;
    }
}

class Ex6_12 {
    public static void main(String[] args) {
    	Car c1 = new Car();
        c1.color = "white";
        c1.gearType = "auto";
        c1.door = 4;	//객체 생성하고 인스턴스 변수의 값을 변경하는 방법
        
        Car c2= new Car("white", "auto", 4);	//매개변수를 갖는 생성자로 값을 변경하는 방법
        
        System.out.println("c1의 color=" + c1.color+ ", gearType=" +c1.gearType+ ", door="+c1.door);
        System.out.println("c2의 color=" + c2.color+ ", gearType=" +c2.gearType+ ", door="+c2.door);
    }
}

결과
c1의 color=white, gearType=auto, door=4
c2의 color=white, gearType=auto, door=4

 

 

⑦ 생성자에서 다른 생성자 호출하기 → this()

- 생성자 호출 조건

→ 생성자의 이름으로 클래스이름 대신 this를 사용한다.

→ 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출 가능하다. 

class Car2 {
    String color;
    String gearType;
    int door;
    
    Car2() {
    	this("white", "auto", 4);
    }
    
    Car2(String color) {
    	this(color, "auto", 4);
    }
    
    Car2(String color, String gearType, int door) {
    	this.color = color;
        this.geartype = gearType;
        this.door = door;
    }
}

class Ex6_13 {
    public static void main(String args[]) {
    	Car2 c1=new Car2();
        Car2 c2=new Car2("blue");
        
        System.out.println("c1의 color="+c1.color+", gearType="+c1.gearType+", door="+c1.door);
        System.out.println("c2의 color="+c2.color+", gearType="+c2.gearType+", door="+c2.door);
    }
}
결과 
c1의 color=white, gearType=auto, door=4
c2의 color=blue, gearType=auto, door=4

 

 

⑧ 객체 자신을 가리키는 참조변수 this

: 생성자의 매개변수로 선언된 변수의 이름과 인스턴스 변수의 이름이 같을 경우 구별이 안 된다. 

이런 경우에는 인스턴스 변수 앞에 'this'를 사용하면 된다. 

class MyMath2{
    long a,b;	//인스턴스 변수
    
    MyMath2(int a, int b) {	//생성자 → this 사용 가능
    	this.a=a;	
        this.b=b;	//지역변수와, 인스턴스 변수를 구별하려고 this 사용
    }
    long add(){	//인스턴스 메서드 → this 사용 가능
    	return a+b;
    }
    static long add(long a, long b) {	//클래스 메서드 → this 사용 불가능
    	return a+b;
    }
}

 

 

⑨ 변수의 초기화

- 멤버변수(클래스 변수와 인스턴스 변수)와 배열의 초기화는 선택이지만, 지역변수 초기화는 필수이다.

- 멤버변수의 초기화

클래스 변수 초기화   인스턴스 변수 초기화

자동 초기화   명시적 초기화(간단)   초기화 블럭, 생성자(복잡)

반응형