[보충] static & instance

부트캠프(END)/보충|2022. 5. 27. 10:02
package day19;

class Member{
	String name;
	String sex;
	String address;
	String tel;
	int age;

	// 생성자 => 초기화만 담당
	Member(String n,String s,String ad,String t,int a)
	{
		name=n;
		sex=s;
		address=ad;
		tel=t;
		age=a;
	}
	
	void print() // 멤버메소드 
	{
		System.out.println("이름:"+name);
		System.out.println("성별:"+sex);
		System.out.println("주소:"+address);
		System.out.println("전화:"+tel);
		System.out.println("나이:"+age);
	}
	// 별도의 메소드기 때문에 => 멤버를 사용하기 위해서는 반드시 메모리 할당후에 사용
	
	static void print2()
	{
		Member m1=new Member("홍길동", "남자", "서울", "011-1111-1111", 20);	
		System.out.println("이름:"+m1.name);
		System.out.println("성별:"+m1.sex);
		System.out.println("주소:"+m1.address);
		System.out.println("전화:"+m1.tel);
		System.out.println("나이:"+m1.age);
	}
	
}
public class Ex1 {
	public static void main(String[] args) {
        Member m1=new Member("홍길동", "남자", "서울", "011-1111-1111", 20);
        Member m2=new Member("심청이", "여자", "서울", "011-1111-1111", 20);
        Member m3=new Member("박문수", "남자", "서울", "011-1111-1111", 20);
	    m1.print();
	    m2.print();
	    m3.print();
	}

}

위 예제를 보다가 이해가 안 되는 부분이 있어 다시 한 번 정리한다.

 

띠용 1. 메서드 안에서 해당 클래스를 호출하려면 this를 써야 한다고 했는데,

print2()에서는 왜 new Member()를 해주는가? 왜 this("홍길동", "남자", "서울",...) 이 아닌가?

→ this를 잘못 이해하고 있었다. static 메서드 안에서는 this를 사용할 수 없다.

this는 생성자 안에서 다른 생성자를 호출하거나, 해당 인스턴스를 호출하는 것이다.

인스턴스가 있어야 쓸 수 있는데 static 메서드를 사용할 때는 인스턴스 자체가 없을 지도 모르니까!

그리고 인스턴스가 여러 개일 경우에 어떤 인스턴스에 수행해야 하는지 알 수 없으니까!

더 자세한 내용은 아래 참고 ↓

https://stackoverflow.com/questions/11664522/why-cant-we-use-this-keyword-in-a-static-method

 

띠용 2. print2()를 사용하면 그 안에서 m1이라는 인스턴스를 만들어 내니,

그 아래 코드에서 인스턴스 m1을 호출할 수 있어야 하는 것 아닌가?

→ print2() 메서드 내에서 생성이 되었다가 {} 스코프를 빠져 나오면서 제거되었기 때문이다.

더 자세한 내용은 아래 참고 ↓

https://stackoverflow.com/questions/40275951/static-method-that-returns-a-new-instance

 

추가

아래 예시에서도 static void display() 영역에서는 에러가 난다.

class Employee {
	String name, dept, loc;
	
	void print () {
		System.out.println("name:"+name);
		System.out.println("dept:"+dept);
		System.out.println("location:"+loc);
	}
	
	static void display () {
		System.out.println("name:"+name); //사용할 수 없다.
		System.out.println("dept:"+dept); //사실은 보이지 않는 this.가 존재함..
		System.out.println("location:"+loc); //static 메서드는 this를 몰라~
	}
}

정 사용하고 싶다면 아래처럼... display() 안에서 새로운 인스턴스를 만들고 그에 대한 출력문을 작성할 수 있다.

class Employee {
	String name, dept, loc;
	
	void print () {
		System.out.println("e="+this);
		System.out.println("name:"+name);
		System.out.println("dept:"+dept);
		System.out.println("location:"+loc);
	}
	
	static void display () {
		Employee e = new Employee();
		e.name = "kimdd";
		e.dept = "deev";
		e.loc = "Busan";
		System.out.println("display:e="+e);
		System.out.println("name:"+e.name);
		System.out.println("dept:"+e.dept); 
		System.out.println("location:"+e.loc); 
	}
}
public class Ex3 {

	public static void main(String[] args) {
		Employee e = new Employee();
		e.name = "kimdoodoo";
		e.dept = "dev";
		e.loc = "Seoul";
		e.display();
		e.print();
	}

}

결과를 보면 display()에서 만든 객체와.. main에서 만든 객체는 다른 객체라는 걸 알 수 있다.

static이 인스턴스에 직접 영향을 주려면..

아래처럼 display()에 매개변수로 주소 객체를 넣어 주어야 한다.

class Employee {
	String name, dept, loc;
	
	void print () {
		System.out.println("name:"+name);
		System.out.println("dept:"+dept);
		System.out.println("location:"+loc);
	}
	
	static void display (Employee e) {
//		Employee e = new Employee();
		e.name = "kimdd";
		e.dept = "deev";
		e.loc = "Busan";
		System.out.println("display:e="+e);
		System.out.println("name:"+e.name);
		System.out.println("dept:"+e.dept); 
		System.out.println("location:"+e.loc); 
	}
}
public class Ex3 {

	public static void main(String[] args) {
		Employee e = new Employee();
		System.out.println("e="+e);
		e.name = "kimdoodoo";
		e.dept = "dev";
		e.loc = "Seoul";
		e.print();
		e.display(e);
	}

}

인스턴스가 여러 개일 수 있는데, 어떤 인스턴스에 해당 메서드를 수행해야 하는지 알려 주어야 하니까....

인스턴스 메서드에도 보이지는 않지만 print(Employee this)가 들어있다고 보면 됨.

 

실제로 static 메서드로 인스턴스 변수를 변경하는 일은 거의 없기 때문에...

그냥 static의 특성을 보기 위한 예시로만 생각하기.

 

근데 회원탈퇴 후에 고객 정보를 블러처리 하는 데에는 쓸 수 있지 않나?

그것도 굳이.. static으로 해줄 필요는 없겠군..

댓글()