코학다식
Java 시작하기 :: OOP(2): 클래스, 변수, 메서드 본문
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.out
은static 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
}
'Programming > Java' 카테고리의 다른 글
Java 시작하기 :: OOP(3) : 인터페이스를 사용한 추상화 (1) | 2019.09.26 |
---|---|
Java 시작하기 :: OOP(1): 클래스, 변수, 메서드 (0) | 2019.09.24 |
Java 시작하기 :: 자바 프로그래밍 기초(2) (0) | 2019.09.10 |
Java 시작하기 :: 자바 프로그래밍 기초 (0) | 2019.09.08 |
Java 시작하기 :: 자바란 무엇일까? (0) | 2019.09.04 |
Comments