Java

JAVA 객체지향

jmboy 2024. 4. 2. 16:31

4. JVM의 메모리 구조

java의 메모리 구조

JVM은 메모리를 용도에 따라 5개의 부분으로 나누어 관리함.

  1. Register
    • 프로그램의 실행 포인터에 대한 정보를 저장하고 관리.
    • 프로그램에서 건드릴 수 없는 영역.
  2. Runtime Constant Pool
    • 상수 값이 들어가는 pool
  3. Method area
    • Class 자체에 대한 정보가 들어가 있는 공간. ex) Method에 대한 정보가 들어가 있음
    • Class안에 정의된 Method에 대한 실행 코드도 들어가 있다.
      • (Class가 처음 사용되는 시점. 딱 1번 실행되는 순간 메모리에 올라감)
  4. Heap area
    • Instance가 생성되는 메모리 공간. instance variable의 공간이 생성됨
    • Method를 호출할 수 있는 실행 Pointer도 있다.
  5. Call stack
    • Stack은 메소드가 호출되면 stack 영역에 해당 메소드를 위한 공간이 생성된다
    • Ex) 메서드 안의 지역 변수
    • Method가 끝나면 해당 영역은 pop되어 없어지고, 안에 있는 지역 변수 역시 공간이 날아간다.
  • static : class variable.
    • 공간 자체가 method area에 만들어져, class 자체에서 사용할 수 있다.
    • 인스턴스를 만들지 않고도 사용할 수 있다.
    • 모든 instance가 공유할 수 있다. 하지만 나중에 수정할 때 어려움이 있다.


문제 1

  1. class에 대한 정보가 올라감. static을 파악. → 1번 출력
  2. main을 찾음 → 4번 출력 , 5번 출력
  3. 생성자 호출 ( 인스턴스의 초기화를 한다 → 공간이 필요 →class 정보를 들고와서 instance variable을 만듬 ) b 공간 만듬 , 2번 출력, 3번 출력
    • 만들고 결과값을 넣어야 함.

this : 현재 자신이 사용하고 있는 레퍼런스


5. Method Overloading

  • 사용하는 방법에 따라 기능이 달라짐.
    • + : 숫자를 더하는 기호
    • “문자열”+10 ⇒ 문자열을 연결하는 기호로 의미가 변한다.
  • Method의 이름이 똑같다. 하지만 사용하는 방법이 다르다 → 인자가 다르다. 다른 메서드로 구별

생성자 오버로딩

  • 이 규칙이 생성자에도 동일하게 적용됨. 따라서 하나의 클래스 안에는 여러개의 생성자가 존재할 수 있다.
  • 여러개의 생성자를 이용하는 이유는 각기 다른 방식으로 인스턴스를 초기화할 필요가 있기 때문에.

6. package 와 import

  • package는 클래스를 용도별로, 종류별로 묶어주는 논리적인 단위. 유지보수와 재활용성을 높이기 위해서 서로 관련있는 클래스를 묶어서 관리함. 물리적으로는 package이름으로 되어있는 폴더를 만들어서 그 안에 클래스를 저장한다.
  • 다른 package안에 있는 클래스를 가져다 쓸 때 import
  • 자바코드는 맨 위에 거의 예외없이 package구문이 나온다.
  • 만약 package구문을 사용하지 않으면 클래스는 default package라는 걸로 묶이게 된다.
  • package는 계층구조로 사용할 수 있다. 이 계층 구조를 표현할 때 . 을 이용한다.

7. Access Modifier (접근 제어자)

  • public : 이 키워드는 필드 앞, Method 앞, 생성자 앞, Class 앞에 붙을 수 있다.
    • package에 상관 없이 자유롭게 access 할 수 있다.
  • private : field , method, constructor 앞에 붙을 수 있다.
    • 해당 요소를 같은 class 안에서만 접근 가능하도록 선언
    • constructor앞에 private를 붙힌다 → single ton 패턴으로 만들 때.
    • 필드는 대부분 private으로 잡는다.
  • default access modifier : 키워드가 적혀있지 않은 접근 제어자.
    • 같은 패키지의 다른 클래스에 의해서만 사용할 수 있다.
  • protected

class는 객체가 가지고 있는 특징, 기능을 하나의 단위로 묶어 놓은 개념.

→ 캡슐화 (Encapsulation) class가 encapsulation한 결과.

이런 클래스 안에는 값과 기능이 들어있다.

다른 클래스에서 정보를 건드리지 못하게 하는 개념 → 정보은닉 information hiding

⇒ 클래스 내부에서만 값을 수정할 수 있고, 외부에서 변경할 수 없도록 데이터를 보호.

  • 자바 언어에서는 이 개념을 access modifier로 구현해 놓고 있다.
    • 외부에서 private로 설정된 값을 알아가거나 설정하기 위해서 특수한 형태의 method를 이용하게 되는데 getter setter라고 한다.

8. static block

  • class가 로드된 후 바로 수행되는 코드 block. main보다 먼저 실행된다.
  • 프로그램에 필요한 리소스를 땡겨올 때 사용

9. Inheritance (상속)

  • 상속은 부모 클래스가 가지고 있는 내용을 자식 class가 물려받는 개념.
  • 그래서 매번 class를 작성할 때 처음부터 작성하는 것이 아니라, 기존 클래스를 확장해서 작성하는 개념이다.
  • 클래스에 계층 구조도가 생긴다
  • 부모 class, parent class, upper class, super class
  • 자식 클래스, child class, sub class
    • 확장시키기 때문에 자식 클래스가 더 크다.

공통적 기능들이 있다.

  • 코드 중복이 많이 일어난다 → 공통의 코드를 parent class로 만든다.
  •  

class diagram

  • 상속받은 클래스 방향으로 화살표
  • 상속 표현
    • keyword : extends
  • 자바는 단일 상속만 지원한다. ( 한번에 여러개의 클래스로부터 상속받지 못한다 )
  • 상속은 항상 좋은가? ⇒ 클래스간의 밀접도가 올라간다. → 클래스를 재활용 할 때 문제.
package test;

public class SuperClass {
    int a = 100;
    String b = "여기는 super class";

    public SuperClass() {
    }
    public void myFunc(){
        System.out.println("super");
    }
}
package test;

public class SubClass extends SuperClass{
    // private은 상속에 안들어간다.
    // 생성자도 상속에 안들어감.
    int c = 500;

    public SubClass() {
        super();
    }


}
  • java에서 나오는 모든 클래스는 상속관계에 있다.
    • Object 클래스를 상속함
      상속
  • 인스턴스를 만들면 상위 클래스의 인스턴스부터 만든다 . → super 사용. 상위 클래스의 constructor 호출
    • Object까지 다 만든다.

is-a relationship

  • Sub Class is a Super ClassPolymorphism 다형성. 여러가지 형태로 이용할 수 있다.
  • ⇒ sub class는 super class와 같으니까 sub class를 써야하는 자리에 super class를 사용할 수 있다.
  • ex) 포유류, 사람
    • 사람 is a 포유류 ( O )
    • 포유류 is a 사람( X )

같은 객체를 reference variable 의 type을 변경시킴으로 인해 다른 형태로 객체를 사용하는 방법.


10. Overriding (method)

  • 상속해서 다시 정의해서 쓰는것.
    • 하위 클래스에서 상속받은 상위클래스의 method를 재정의해서 사용하는 방법
    • field를 재정의시 공간을 따로 만들어 사용. (Over shadow)
  • method는 오버라이딩 되어있을 경우 오버라이딩 된 걸로 찾아간다. dynamic binding
    • field는 그렇지 않다.^^

11. this, super, this(), super()

  • this : 현재 사용하고 있는 객체에 대한 reference
  • super : 현재 사용하고 있는 객체에 대한 reference . type은 상위 타입.
  • super() : 상위 클래스의 생성자를 호출하는 구문
  • this() : 내가 가진 해당 클래스의 다른 생성자( 인자의 개수나 타입이 다른 ) 를 호출.

12. Quiz

  • 다음 코드의 출력 순서를 맞춰보시오.

문제 2

  • 상위 클래스를 먼저 호출 → SuperClass의 static 호출 → 2번문장
  • 이후 int d → 7번 문장
  • main 메서드 동작 → 10번 문장
  • Exam01의 생성자 호출 → 상위 클래스의 생성자 호출 → 상위 클래스의 인스턴스 초기화를 위해 필드 호출 → 1번 문장
  • super(100)이 있으니 SuperClass(100)으로 들어감. → this() → 3번 문장 , 4번 문장
  • 상위 생성자 호출 후 인스턴스 초기화 → int c 6번문장
  • staticCall 8번문장
  • super.myFunc → 오버라이딩 되어있으나 아직 Exam01의 객체가 완성이 되지 않음. → 해당 인스턴스의 메서드가 만들어지지 않은 상태임 → super의 myFunc를 불러옴 → 5번 문장
  • obj.myFunc에서 @Override되어 있으니 9번 문장

정답 : 2-7-10-1-3-4-6-8-5-9