blues_log
article thumbnail

오늘 배운 내용

  • Java : 객체지향 전반적인 내용 복습
  • HTML

학습한 내용

 

클래스(class)와 인스턴스(instance)

클래스는 변수와 메소드를 담는 상자이다.

인스턴스는 클래스를 복제(?)하지만 그 안에서 변수와 메소드를 일부 변경할 수 있다.

 

클래스는 설계도, 인스턴스는 설계도로 만들어진 제품 정도로 이해하면 쉬움 !

 

클래스와 인스턴스를 사용하게 되면 코드의 중복을 제거하고 코드의 수정이 용이해진다.


클래스 멤버와 인스턴스 멤버

클래스 변수는 모든 인스턴스가 공유하는 변수이다. 

클래스에서 만들어진 인스턴스는 자연스럽게 클래스의 변수의 값을 갖는다.

 

클래스 변수의 용도는 다음과 같다.

  • 인스턴스에 따라서 변하지 않는 값이 필요한 경우
  • 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
  • 값의 변경 사항을 모든 인스턴스가 공유해야하는 경우

 

클래스 메소드는 메소드가 인스턴스 변수를 참조하지 않는다면 클래스 메소드를 사용한다.

그 결과로는 불필요한 인스턴스의 생성을 막을 수 있고, 결과적으로 메모리를 아껴서 좀 더 빠른 프로그램을 개발할 수 있게 된다.


클래스 멤버와 인스턴스 멤버의 관계

결론부터 말하면 다음과 같은 관계를 갖는다.

  • 클래스 메소드는 인스턴스 멤버에 접근할 수 없다.
  • 인스턴스 메소드는 클래스 멤버에 접근할 수 있다.

 

다음 코드에서 그 차이를 익힐 수 있다.

class Foo{
    public static String classVar = "I class var";
    public String instanceVar = "I instance var";
    public static void classMethod() {
        System.out.println(classVar); // Ok
        System.out.println(instanceVar); // Error
    }
    public void instanceMethod() {
        System.out.println(classVar); // Ok
        System.out.println(instanceVar); // Ok
    }
}
public class StaticApp {
 
    public static void main(String[] args) {
        System.out.println(Foo.classVar); // OK
        System.out.println(Foo.instanceVar); // Error
        Foo.classMethod();
        Foo.instanceMethod();
         
        Foo f1 = new Foo();
        Foo f2 = new Foo();
      
        System.out.println(f1.classVar); // I class var
        System.out.println(f1.instanceVar); // I instance var
      
        f1.classVar = "changed by f1";
        System.out.println(Foo.classVar); // changed by f1
        System.out.println(f2.classVar);  // changed by f1
      
        f1.instanceVar = "changed by f1";
        System.out.println(f1.instanceVar); // changed by f1
        System.out.println(f2.instanceVar); // I instance var
    }
 
}

그림으로 관계를 정리하면 다음과 같다.

클래스 멤버와 인스턴스 멤버의 관계 (생활코딩 강의 영상 캡처)

 

 


느낀점

 

참 신기한게 처음에 객체지향 강의를 들었을 때에는 잘 이해가 되지 않았던 부분이 복습을 하는 과정에서는 어느샌가 자연스럽게 받아들여지는 부분들도 있었다. 생활코딩님이 말씀하신 언젠가는 이해가 될테니 일단 진도를 끝내라고 하셨던 것이 효과가 있었던 것 같다.

 

복습을 더 한다면 어느샌가 자연스럽게 객체지향을 마스터할 수 있지 않을까 조심스럽게 예상해본다..!

 

HTML 내용도 얼른 블로그에 정리해서 필요할 때마다 볼 수 있도록 해야겠다.


참고

https://opentutorials.org/module/4406/27016