관련이 있는 변수와 메소드를 모은 수납상자와 같은 클래스라는 개념을 이용해서 프로그램의 구조를 만들어 가는 방식을
객체 지향 프로그래밍(OOP)라고 한다.
예를 들어 출력과 관련된 기능을 하나의 클래스로 분리해 만든다면 아래와 같다.
class Print {
public static String delimiter = "";
public static void printA() {
System.out.println(delimiter);
System.out.println("A");
System.out.println("A");
}
public static void printB() {
System.out.println(delimiter);
System.out.println("B");
System.out.println("B");
}
}
클래스는 한 파일에 여러 개를 넣을 수 있지만 접근제어자public이 붙은 클래스는 한 java파일에 하나만 있을 수 있다.
클래스들을 한 파일에 여러개를 만들수 있지만 여러 클래스를 각각 java파일로 만들면 기능별로 쪼개서 코드들을 정리정돈 할 수 있다.
클래스는 어떤 형틀이고 인스턴스는 그 형틀로 찍어낸 실체와 같다.
인스턴스는 new 키워드를 통해 생성 할 수 있다.
인스턴스는 한 번 만들어지면 그 인스턴스를 바꾼다 해도 다른 인스턴스에 영향은 없다.
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
}
}
class Foo 에서 static이 없는 변수 String instanceVar는 인스턴스를 통해 사용해야 하기 때문에 Foo.instanceVar는 에러를 일으킨다.
또한 Foo의 클래스 메소드 public static void classMethod()에서 인스턴스 변수 String instanceVar에 접근할때도 에러가 난다.
Foo의 인스턴스를 생성하지 않고 인스턴스 메소드인 Foo.instanceMethod에 접근 할 때 에러 발생
Foo의 인스턴스 f1과 f2를 생성해 보자
f1이 클래스 변수에 접근 할때(classVar) 그 값을 변경하면 f2가 가르키는 변수(f2.classVar)도 바뀐다.
f1이 인스턴스 변수 f1.instanceVar의 값을 바꾸면 인스턴스는 복제본이기 때문에 f2.instanceVar의 값은 바뀌지 않는다.
인스턴스가 생성될 때 꼭 실행되어야 하는 어떠한 작업들을 생성자를 통해 할 수 있다.
생성자를 사용할땐 클래스와 똑같은 이름의 메소드를 사용한다.
생성자는 반환값이 없다.
만약 생성자를 따로 작성하지 않으면 컴파일러는 자동으로 생성자를 생성해준다.
this 키워드는 인스턴스 자기 자신을 가리키는 키워드다.
클래스의 메소드에서 메소드의 매개변수와 멤버변수의 변수이름이 겹칠때 유용하게 사용한다.
class Print {
public String delimiter = "";
public Print(String delimiter) {
this.delimiter = delimiter;
}
public void A() {
System.out.println(this.delimiter);
System.out.println("A");
System.out.println("A");
}
public void B() {
System.out.println(this.delimiter);
System.out.println("B");
System.out.println("B");
}
}
위의 코드에서 this 키워드를 활용해 변수 delimiter사용이 겹칠때 유용하게 사용한다.
Reference 생활코딩 자바