포스트

17. 클래스와 방법론

클래스의 변수와 방법론을 알아가자.

17. 클래스와 방법론

클래스 정의와 방법론

  • 방법론 : 클래스를 정의하는 기법들에 대한 조언

GRASP 방법론

  • Information Expert
  • LowCoupling
  • High Cohesion
  • Creator
  • Controller

SOLID

  • SRP(single Responsibility Principle)
  • OCP(Open/Closed Principle)
  • LSP(Liskov Substitution Principle)
  • ISP(Interface Segregation Principle)
  • DIP(Dependency Inversion Principle)

이 두가지 모두를 Design Patterns라고 함

변수 초기화

1
2
3
4
5
6
Class A{
	static int v1;
	void m1(){
		Board b = new Board();
	}
}
  • Method Area : A클래스가 메모리에 로딩될 때 자동 생성됨, 타입에 맞춰서 자동 초기화 (v1 → 0)
  • JVM Stack : 메서드가 호출될 때 생성됨, 변수를 초기화시키지 않음. 즉, 변수의 값을 사용하기 전에 반드시 직접 초기화 시켜야함 (b = new Board)
  • Heap : new 명령 실행 시 생성 타입에 맞춰 자동 초기화 됨. (new Board → [title → nullcontent → null ])

클래스 선언 위치

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test03 {
  // nested class(중첩 클래스)
  class B { - } // non-static nested class
  static class C { - } // static nested class

  Object obj1 = new Object() {}; // anonymous class

  void m1() {
    class D { - } // local class
    Object obj2 = new Object() {}; // anonymous class
  }
  
  void m2(){ /* m1 메서드 안에 있는 class는 사용 불가함 */ }
}

// package member class
class A { - }
  • A : package member class(= top level class)
  • B : non class → non-static nested class(= inner class)
  • C : static class → static nested class
  • D : nested class (= local class)

중첩 클래스와 .class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test03 { // -------------| Test01.class    : 중첩 클래스를 포함하지 않음
  // nested class
  class B { - } //--------------------| Test03$B.class
  static class C { - } //-------------| Test03$C.class

  Object obj1 = new Object() {}; //---| Test03$1.class  : 이름이 없어 번호를 임의 부여

  void m1() {
    class D { - } //------------------| Test03$1D.class : 1 = local 클래스임을 표시
    Object obj2 = new Object() {}; //-| Test03$2.class 
  }
}

class A { - } //----------------------| A.class

변수 선언과 변수

변수 선언

static int sqeNo, String name, User obj = 변수를 생성시키는 명령문(= 변수 선언), 변수는 메모리일 뿐임 → Method area에 올라감
new User, new ~ = 인스턴스 변수 선언을 실행(= 인스턴스를 생성함)시키는 명령문 → 실행 시 Heap에 올라감
void main, m( ); = 메서드 실행 → 메서드는 실행 시 JVM Stack에 올라감, main은 시작과 동시에 실행되어 올라간다.

자바의 클래스 계층도와 레퍼런스

  • vehicle - capacity—————————————super 클래스(부모 클래스)
    • bicycle - chain———————————————sub 클래스(자식 클래스)
      • motorCycle - engine, cc———sub 클래스(자식 클래스)
    • Car - engine, cc, airbag
      • truck - weight, isDump
1
2
3
4
5
6
7
8
9
10
11
Motorcle m = new MotorCycle(); 
m.engine = ~;
m.cc = ~;
m.chai = ~; //bicycle의 자식 클래스이기 때문에 사용 가능함
m.capacity = ~; //상동

Bicycle bi = new MotorCycle(); // 상위 클래스의 레퍼런스는 하위 클래스의 인스턴스를 담을 수 있다.
bi.chain() = ~;
bi.capacity = ~;

Vehicl ve = new MotorCycle(); // 상동
  • 상위 분류명으로 하위 분류 객체를 가리킬 수 있다.

캡슐화(encapculation)

데이터와 데이터 처리하는 메서드를 하나의 클래스로 묶는데 이를 캡슐화라고한다.
데이터를 은닉 시켜 데이터 무결성을 유지하고 복잡한 로직을 감추면서 가독성과 유지보수성이 높아진다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.