JAVA | 실습 - Class와 Instance

여경·2021년 5월 25일
0

학교수업-Java

목록 보기
4/5


#### Class, Instance

Class : 서로 연관된 메소드와 변수를 그룹핑해서 이름을 붙인 것

Instance : 이 클래스를 복제하여 서로 다른 내부적인 상태를 갖고있는 복제본

Access level modifiers

public, protexted, default, private

static

static - class method
no static - instance method

class는 비슷한 맥락의 method와 variable을 정리해서 묶어놓은 것이다. class에 .을 찍어서 해당 class가 가지고 있는 method를 사용할 수 있다.
그런데 이를 여러번 반복해야한다면 매번 특정한 조건을 반복해서 적어야 할지도 모른다. 그래서 필요한 것이 instance. instance는 기본적으로 class의 복제본인데, 추가로 내가 설정해준 설정값을 갖는다. instance를 선언하는 것은, datatype이 해당 class인 변수를 선언하는 것과 같다.

class의 사용

  1. class로 묶어주지 않았을 경우
 public static String delimiter = ""; //전역변수 선언
    public static void main(String[] args) {
        delimiter = "----"; //전역변수 호출
        printA();
        printB();
        delimiter = "****";
        printA();
        printB();
    }
    public static void printB() {
        System.out.println(delimiter);
        System.out.println("B");
        System.out.println("B");
    }
    public static void printA() {
        System.out.println(delimiter);
        System.out.println("A");
        System.out.println("A");
    }
  1. class로 연관된 Method들을 묶었을 경우
class Print{
    public static String delimiter = ""; //전역변수 선언
    public static void B() {
        System.out.println(delimiter);
        System.out.println("B");
        System.out.println("B");
    }
    public static void A() {
        System.out.println(delimiter);
        System.out.println("A");
        System.out.println("A");
    }
public class MyOOPwithClass {
    public static void main(String[] args) {
        Print.delimiter = "----"; //전역변수 호출
        Print.A();
        Print.B();
        Print.delimiter = "****";
        Print.A();
        Print.B();
    }
}
}

편의성 차이가 크다. 유지보수에 훨씬 용이한 코드가 된다.

static


static이 붙은 클래스의 변수에서는 인스턴스에서 값을 변경하면 클래스 값도 변경되고, 반대로 클래스에서 변수를 변경하면 인스턴스 값들도 변경된다.
static이 붙지 않은 클래스의 변수에서는 인스턴스에서 변수를 바꾸더라도 클래스의 변수값은 변경되지 않는다.

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
    }
}

0개의 댓글