코학다식

Java 시작하기 :: OOP(2): 클래스, 변수, 메서드 본문

Programming/Java

Java 시작하기 :: OOP(2): 클래스, 변수, 메서드

copeng 2019. 9. 24. 21:26

Java 시작하기(5)

Object Oriented Programming(2): classes, variables, and methods

 

 

 

Final 인스턴스 변수


 

  • 인스턴스 변수가 final 키워드를 사용해서 선언되었다면, 그 변수의 값은 생성자 안에서만 결정될 수 있다.

 

class Employee {
    private final String name;
    public Employee() {
        this.name = "Kim";
    }
    public void setName(String name){
        this.name = name; // Error: cannot assign a value to a final instance variable
    }
}

 

 

 

Static 변수


 

  • 클래스를 정의할 때, 변수는 static 변수로 정의될 수 있다.
    • static 변수는 클래스에 속한다. 클래스의 인스턴스에 속하지 않는다.
  • 인스턴스 변수는 각각의 인스턴스에 대해 독립적이다.
  • static 변수는 모든 인스턴스 사이에서 "공유된다".

 

class Employee {
    private static int lastId = 0; // static variable
    private int id; // instance variable
    public Employee() { id = ++lastId; }
    public int getId() { return this.id; }
    public int getLastID() { return this.lastId; }
}

public class Lecture {
    public static void main(String args[]){
        Employee m = new Employee();
        Employee n = new Employee();
        System.out.println(m.getId()); // prints 1
        System.out.println(n.getId()); // prints 2
        System.out.println(m.getLastId()); // prints 2
        System.out.println(n.getLastId()); // prints 2
    }
}

 

  • static 변수는 일반적으로 변수 선언과 함께 초기화된다.
  • 초기화를 위해 static 초기화 블럭을 사용할 수도 있다.

 

class Employee {
    private static int lastId;
    static {
        lastId = 0;
    }
    private int id;
    public Employee() { id = ++lastId; }
    public int getId() { return this.id; }
    public int getLastID() { return this.lastId; }
}

 

 

 

Static final 변수


 

  • 일반적으로 클래스와 관계된 상수는 static 변수로 정의된다.

  • Math 라이브러리 클래스는 PI라는 static 변수를 가진다.

    • 만약 PI가 static 변수가 아니라면, 사용하기 위해 Math 클래스의 객체가 생성되어야만 한다.
  • System.outstatic final 변수이다.

    • System 클래스에 정의되어 있다!

 

// defined in library
public class Math {
    public static final doubel PI = ... ;
}

public class System {
    public static final PrintStream out;
}

 

 

 

Static 메서드


 

  • static 메서드는 클래스 자체에 속한 메서드이다.
    • 사용하기 위해 객체를 생성할 필요가 없다.
  • 예컨대, pow 메서드는 Math 클래스의 static 메서드이다.
    • static 메서드를 호출할 때, 객체 이름 대신 클래스 이름이 사용된다.
  • main 메서드도 static 메서드로 정의된다.
  • 인스턴스 메서드로 static 변수에 접근할 수 있다.
  • 그러나, 원칙적으로 static 메서드를 사용해서 static 변수에 접근해야 한다.
  • static 메서드에서는 this를 사용할 수 없다.
    • this는 객체를 나타내는데 static 메서드는 객체와 관계가 없기 때문이다.
  • static 메서드는 인스턴스 변수에 접근할 수 없다.

 

 

 

Java: Call-by-Value


 

  • 자바는 메서드를 호출할 때 Call-by-Value 원칙을 사용한다.
  • Call-by-Value
    • 메서드를 호출할 때, 인자들의 값이 메서드의 매개변수에 복사된다.
    • 아래 예시에서, a와 b의 값을 바꾸는 것은 a1과 a2의 값에 영향을 주지 않는다.

 

public class Lecture {
    public static void swap(int a, int b){
        int temp = a;
        a = b;
        b = temp;
    }
    public static void main(String args[]){
        int a1 = 10;
        int a2 = 20;
        swap(a1, a2);
        System.out.println(al + " " + a2); // prints 10 20
    }
}

 

  • 배열과 객체들이 메서드에 전달될 때는 결과에 주의해야 한다.
    • 배열이 인자로 전달될 때, 배열의 참조(배열의 메모리 주소)가 Call-by-value를 사용해서 전달된다.
    • 이는 객체도 마찬가지이다.

 

class Employee {
    String name;
    public Employee(String name){
        this.name = name;
    }
}

public class Lecture {
    public static void swap(int [] arr){
        int temp = arr[0];
        arr[0] = arr[1];
        arr[1] = temp;
    }
    public static void changeName(Employee e){
        e.name = "John";
    }
    public static void main(String args[]){
        int a = new int[2];
        a[0] = 10;
        a[1] = 20;
        swap(a);
        System.out.println(a[0] + " " + a[1]); // prints 20 10

        Employee m = new Employee("Peter");
        changeName(m);
        System.out.println(m.name); // prints John
}
Comments