클래스: 객체를 정의하는 틀, 설계도
인스턴스: 클래스의 복제본 , 클래스타입의 객체, 메모리에 할당된 객체
Static
앞 글에서처럼
Static은 class method
No Static은 instance method
그림과 같이 static이 들어가있으면 인스턴스 생성시 원본 클래스의 주소를 가르키게 되고
no static일 경우 같은 값이 인스턴스에 생성되게 된다!!!
예제를 통해 그림을 확인해보자!!
1.
public static void main(String args[]) {
Foo f1 = new Foo();
Foo f2 = new Foo();
System.out.println(f1.classVar);
System.out.println(f1.instanceVar);
}
class Foo{
public static String classVar = "classVar";
public String instanceVar = "instanceVar";
}
classVar , instanceVar 출력확인!!
2.
public static void main(String args[]) {
Foo f1 = new Foo();
Foo f2 = new Foo();
f1.classVar = "changed by f1";
System.out.println(Foo.classVar);
System.out.println(f2.classVar);
}
class Foo{
public static String classVar = "classVar";
public String instanceVar = "instanceVar";
}
f1은 인스턴스이기 때문에 위에 사진처럼 Foo클래스의 메서드인 classVar를 가르키고있다
근데 여기서 f1.classVar = "changed bt f1"으로 가르키고있는 Foo클래스의 메서드인 classVar의 값을 바꿔주었기 때문에
Foo클래스나 f2.classVar의 값이 changed by f1으로 출력된다
3.
public static void main(String args[]) {
Foo f1 = new Foo();
Foo f2 = new Foo();
f1.instanceVar = "changed by f1-1";
System.out.println(f1.instanceVar);
System.out.println(f2.instanceVar);
}
class Foo{
public static String classVar = "classVar";
public String instanceVar = "instanceVar";
}
f1.instanceVar를 "changed by f1-1"로 바꾸었다
위의 사진처럼 static이 없는 instanceVar는 원본 클래스를 가르키는게 아니라 복제가 된것이기 때문에 바꾸어도
f1의 값만 바뀌지 f2및 원본값은 바뀌지않는다.
changed by f1-1
instanceVar
가 출력된다!!
생성자와 this
생성자: 인스턴스가 생성될 때
- 반드시 처리해야 할 작업의 초깃값 지정
- 혹은 최초로 실행되어야 할 작업들 수행하고 싶을 때 생성자 사용
인스턴스를 생성할 때 자바는 이 클래스와 동일한 이름의 메소드가 있다면 그 메소드를 호출하도록 약속되어 있음
생성자에는 `static`이나 리턴 데이터 타입을 지정하지 않음
`this`: 클래스가 인스턴스화 되었을 때 인스턴스를 가리키는 특수한 이름
예제
1.
public static void main(String args[]) {
Print p1 = new Print("AAAA");
p1.A();
}
}
class Print {
public String delimiter="";
public Print(String _delimiter){
delimiter = _delimiter;
}
public void A(){
System.out.println(delimiter);
}
}
생성자는 클래스명과 똑같이 주면 되기 때문에
p1이라는 Print클래스의 인스턴스를 만들고 파라미터값으로 "AAAA"를주면
public Print(String _delimiter){
delimiter = _delimiter;
}
가 먼저 실행되게 되고 static이 없는 인스턴스 메서드인 delimiter값이 "AAAA"가되어
A() 메서드를 실행하면 AAAA가 출력되게 된다!!!
예제
2.
public static void main(String args[]) {
Print p1 = new Print("AAAA");
p1.A();
}
}
class Print {
public String delimiter=""; //1
public Print(String delimiter){ //2
delimiter = delimiter; //3
}
public void A(){
System.out.println(delimiter);
}
}
위와는 다르게 _delimiter가 아닌 delimiter로 생성자 파라미터를 통일시키면
//3에있는 delimiter = delimiter에서 앞에 delimiter는 위에서는 //1을 가르켰다면 여기서는 //2를 가르켜
p1.A();를 출력하면 ""빈값이 나오게 된다
그러면 //1을 가르키려면 어떻게 해야 될까?
예제
3.
public static void main(String args[]) {
Print p1 = new Print("AAAA");
p1.A();
}
}
class Print {
public String delimiter=""; //1
public Print(String delimiter){ //2
this.delimiter = delimiter; //3
}
public void A(){
System.out.println(this.delimiter);
}
}
this를 붙이면 된다
this는 클래스가 인스턴스화 되었을때 인스턴스의 메서드를 가르키는 것이다!!
즉, this를 쓰게되면 해당 메서드안에서 찾는것이 아닌 만들어진 인스턴스의 메서드에서 해당 변수를 찾는다!!
코드
https://github.com/developer-hyun/JAVA
'IT 관련 > JAVA' 카테고리의 다른 글
자바(JAVA)란? (0) | 2022.04.08 |
---|---|
자바 상속(inheritance) (0) | 2022.03.29 |
자바의 static이란? (0) | 2022.03.25 |
자바 public ,protected , default, private (0) | 2022.03.25 |
자바 메소드(java method)란? (0) | 2022.03.25 |