백엔드 수업 #06 클래스 - 09 인스턴스 멤버와 this

sookyoung.k·2022년 11월 21일
0

아 은비언니랑 이야기하다가 벨로그 적었던 것 중에서 고칠 게 있었는데 까먹었다. 필드 쪽... 이었는데... 나는 잘못된 지식을 전파하고 있는 스레기였던 것이다. 필드 어려워잉. 언젠간 꼭 고치겠습니다. 이론도 공부를 계속 해주는 것이 좋을 것 같아 부랴부랴 다시 쓰는 벨로그. 시작!


인스턴스(instance) 멤버

처음에 배울 때는 객체와 인스턴스 거의 비슷한 거라고 배웠는데 조오금 다름. 객체에 값이 할당이 되면 그걸 인스턴스라고 부른다고 했던 것 같다. 이클립스 어딘가 적어뒀는데... 못 찾음.

책에서는 뭐라고 되어있냐면 '객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 말한다' 고 되어 있다. 각각 인스턴스 필드와 인스턴스 메소드라고 함.

이들은 객체에 소속된 멤버이기 때문에 꼭 객체가 있어야만 사용이 가능하다.

public class Car {
	// 필드 
    int gas; // 초기값은 주지 않고 인스턴스 필드를 선언만 한 상태 
    
    // 메소드 
    void setSpeed(int Speed); {...} 
}

위와 같은 Car 클래스가 있다고 해봅시다. 이 필드와 메소드를 외부클래스에서 사용하기 위해서는! Car의 객체가 필요하다는 이야기다. 객체가 있어야 사용이 가능해진다는 의미.

public class CarExample {
	public static void main(String[] args) {
    	Car myCar = new Car();
        // 데이터타입 변수명(참조변수) = new 생성자; 
        // 이렇게 객체 선언을 해주어야 필드와 메소드에 접근이 가능하다는 것임 
        
        myCar.gas = 10; // 객체 선언 후 초기값 할당
        myCar.setSpeed(60); // 매개변수 60을 주어 setSpeed() 메소드 실행
    }
}

바로 요런 식으로!

  • 인스턴스 필드 gas는 객체마다 따로 존재!

  • 인스턴스 메소드 setSpeed()는 메소드 영역에 저장되고 공유됨

this

객체 내부에서도 인스턴스 멤버에 접근할 때 사용하는 것은 바로 this이다.
this는 객체가 스스로를 지칭하는 말인 것임.

public class Car {
	// 필드 
    String model;
    int speed;
    
    // 생성자 
    Car (String model) { // 7. 생성자는 객체가 생성됨과 동시에 실행이 이미 되었습니다. 객체에서 매개변수로 "포르쉐", "벤츠"를 각각 주었죠? 그 매개변수가 this.model, 즉 위의 인스턴스 필드의 초기값으로 할당이 되는 것입니다! 고렇게 출력해주면 됨. 
    	this.model = model;
    }
    
    // 메소드 
    void setSpeed(int Speed); { // 5. 매개개변수가 int Speed에 쏙 들어오게 되면 
    	this.speed = speed; // 우측 speed에 10, 20, ..., 50까지 하나씩 할당이 되고 그것이 this.speed 즉 인스턴스 필드의 초기값으로 재할당이 됩니다. 아래 this.speed에 각각 초기값을 출력해주면 되는 것입니다. 
    } 
    
    void run() {
    	for(int i=10; i<=50; i+=10) { // 3. i의 초기값은 10이고 50까지 10씩 커지는 포문입니다. 
        	this.setSpeed(i); // 4. setSpeed()에 i가 매개변수로 들어오는군요. 그렇담 또 setSpeed() 메소드로 가봅시다. 
            System.out.println(this.model + "가 달립니다.(시속:" + this.speed + "km/h)"); // 6. 이번엔 this.model이 있는 곳을 찾아봅시다. 
        }
    }
}

public class CarExample {
	public static void main(String[] args) {
    	Car myCar = new Car("포르쉐"); // 1. 객체 선언! myCar와 yourCar라는 변수명으로 객체를 선언해준다. 
        Car yourCar = new Car("벤츠"); // 주의할 점 - 생성자에 매개변수가 들어가니까 꼭 써줘야 함. 
        
        myCar.run(); // 2. run() 메소드를 실행하네요? 그렇담 메소드가 있는 곳으로 가봅시다. 
        yourCar.run(); // 8. 할당된 값들을... 고대로 출력하면 끝. 
    }
}

[출력 결과]
포르쉐가 달립니다. (시속: 10km/h)
포르쉐가 달립니다. (시속: 20km/h)
포르쉐가 달립니다. (시속: 30km/h)
포르쉐가 달립니다. (시속: 40km/h)
포르쉐가 달립니다. (시속: 50km/h)
벤츠가 달립니다. (시속: 10km/h)
벤츠가 달립니다. (시속: 20km/h)
벤츠가 달립니다. (시속: 30km/h)
벤츠가 달립니다. (시속: 40km/h)
벤츠가 달립니다. (시속: 50km/h)

  • this는 주로 생성자와 메소드의 매개 변수 이름이 필드와 동일할 경우, 인스턴스 멤버인 필드임을 명시하고자 할 때 사용된다. this. 뒤에 나오는 것은 인스턴스 멤버인 필드인 것이고 = 뒤에 나오는 것은 매개변수! 그래서 매개변수가 인스턴스 필드에 저장되면서 초기값이 할당되는 것임!

  • 매개변수 → 필드에 쏙 들어가는 것입니다.

profile
영차영차 😎

0개의 댓글