클래스: 객체를 정의하는 틀, 설계도

인스턴스: 클래스의 복제본 , 클래스타입의 객체, 메모리에 할당된 객체

 

 

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

 

GitHub - developer-hyun/JAVA: 자바에 대한 공부 기록(git-flow연습 적용)

자바에 대한 공부 기록(git-flow연습 적용). Contribute to developer-hyun/JAVA development by creating an account on GitHub.

github.com

 

 

 

 

'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

+ Recent posts