본문 바로가기
  • 시 쓰는 개발자
프로그래밍 문법/Java

6장 객체지향 (4) 기본형/참조형 매개변수 , static/인스턴스 메소드

by poetDeveloper 2024. 3. 10.

JAVA의 정석 강의를 들으며 공부하며 정리했습니다. 너무 자잘한 내용은 안적었습니다.

 

[자바의 정석 - 기초편] ch6-23 기본형 매개변수

  • 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (read only) 여기서 말하는 기본형은 다음 8개의 변수를 말함. int, float, char, String, byte, boolean, double, long
  • 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read & write)
class Data { int x; }

class PrimitiveParamEx {
	public static void main(String[] args) {
		Data d = new Data();
		d.x = 10;
		System.out.println("main() : x = " + d.x);
		change(d.x); // 값 자체를 전달해줌
		System.out.println("After change(d.x)");
		System.out.println("main() : x = " + d.x);
	}
	static void change(int x) {  // 기본형 매개변수
		x = 1000; // 지역변수라서 실제 d.x의 값은 변하지 않음.
		System.out.println("change() : x = " + x);
	}
}

한마디로, 메소드의 매개변수 값을 재할당 해도 그것은 지역변수이기 때문에 메소드 실행이 끝나면 사라지고, 할당된 값 또한 지역변수에 할당한 값이라 함수 밖에서는 영향이 없다.

[자바의 정석 - 기초편] ch6-24 참조형 매개변수

class Data { int x; }

class ReferenceParamEx {
	public static void main(String[] args) {
		Data d = new Data();
		d.x = 10;
		System.out.println("main() : x = " + d.x);
		change(d); // 객체 자체를 전달해줌
		System.out.println("After change(d)");
		System.out.println("main() : x = " + d.x);
	}
	static void change(Data d) { // Data라는 참조형 매개변수로 받아서 객체 d를 받음.
		d.x = 1000; // 객체를 받아오고 그 값을 바꾸는 거라, 아까랑은 다르게 d.x가 바뀜
		System.out.println("change() : x = " + d.x);
	}
}

[자바의 정석 - 기초편] ch6-25 참조형 반환타입

반환타입이 참조형이라는 것은 복사한 객체의 주소를 반환한다는 것이다.

class Data { int x; }

class ReferenceReturnEx {
	public static void main(String[] args) 
	{
		Data d = new Data();
		d.x = 10;
		Data d2 = copy(d); // copy함수의 return type이 Data라서 d2에 할당할 수 있다.
		System.out.println("d.x ="+d.x); // 10
		System.out.println("d2.x="+d2.x); // 10
	}
	static Data copy(Data d) { // 반환타입이 Data라는 참조형
		Data tmp = new Data(); // return type을 Data로 맞춰준 것.
		tmp.x = d.x;
		return tmp; 
	}
}

[자바의 정석 - 기초편] ch6-26~29 static메서드와 인스턴스 메서드

  인스턴스 메소드 static 메소드
호출 방법 인스턴스 생성 후, 참조변수.메소드이름() 객체 생성 없이, 클래스이름.메소드이름()
ex) Math.random()은 객체생성 없이도 사용함.
관련 멤버 인스턴스 변수, 인스턴스 메소드과 관련있는 작업을 한다. 인스턴스 변수, 인스턴스 메소드과 관련없는 작업을 한다.
iv 사용 여부 메소드 내에서 iv 사용 가능하고 스테틱 메소드는 언제나 호출 가능. static 메소드 내에서 iv 사용 불가능.
인스턴스 변수 사용 여부로 두 메소드의 역할이 갈린다.
그래서, 언제 메소드에 static을 붙여주느냐? iv를 사용하지 않는 경우에.

Q. 왜 static 메소드에서는 인스턴스 변수를 사용하지 못할까?

static 메소드는 언제나 호출해서 사용 가능해야하는 메소드인데, iv는 객체가 있을 때만 사용이 가능함. 근데 스테틱 메소드 호출했는데 객체가 생성되지 않았을 수 있으니 항상 쓸 수 있다는 스테틱 메소드에 제약이 생겨버림. 그래서 static 메소드 내에서는 iv를 사용 못함.  자연스럽게 인스턴스 메소드 또한 호출 불가능. im iv를 가지고 작업하는 메소드이기 때문에 iv와 연관되는 im도 스테틱 메소드에서 사용이 불가능하다.