2 분 소요

2022. 12. 29. 수업내용 정리

클래스


클래스

  • 클래스(Class)는 서로 관련있는 멤버(Member)를 포함하기 위한 존재이다.
  • 클래스의 명명은 파스칼 케이스를 이용하고, 단수형 명사를 이용한다.
    [접근 제한자] [abstract]? class [클래스 이름] [extends [부모 클래스 이름]]? [implements [인터페이스 이름,...]]? {
    
    }
    
    public class First {
    
    }
    

    위 클래스의 접근 제한자는 public이고, 추상적이지 않으며 이름은 First이다. 별도로 상속(Inheritance) 및 구현(Implementation)이 언급되어 있지 않다.

  • 접근 제한자가 public인 클래스는 그 클래스 코드를 포함하는 파일의 실제 이름과 동일해야 한다.
  • 클래스가 내부에 포함하고 있을 수 있는 대상은 많지만 주로 멤버 변수(Member Variable)와 메서드(Method)가 주류를 이룬다.



객체화(Instantiation)

  • 어떠한 타입에(주로 클래스)에 대한 독릷적인 객체(값)를 생성하기 위해 사용한다.
  • 클래스 객체화 시 클래스가 멤버로 가지고 있는 비정상적인 모든 것이 새롭게 생기게(초기화 혹은 객체화) 된다.
    [타입] [변수 이름] = new [타입] [생성자 호출부];
    
    T t = new T(); //String name = new String(); 문자열 타입의 객체 생성..  
    
    Country korea = new Country();
    korea.name = "대한민국";
    korea.population = 51_740_000;
    korea.area = 100_210D;
    
    Country germany = new Country(); // 객체
    germany.name="독일";
    germany.population = 83_130_000;
    germany.area = 357_588D;
    



변수가 호출되는 과정….(기본타입.. 참조타입.. 클래스..)


Country korea = new Country();
korea.name = "대한민국";
korea.population = 51_740_000;
korea.area = 100_210D;

Country germany = new Country(); // 객체
germany.name="독일";
germany.population = 83_130_000;
germany.area = 357_588D;
System.out.println(korea.name+"의 면적당 인구는 "+korea.population/korea.area+"(명/㎢)입니다.");
/* 
  1. country class 내부에 있는 멤버 변수에 접근(호출)
  2. 일단, class 타입이 저장된 STACK 메모리 영역에 접근, 이 때 아래 그림을 보면 HEAP 메모리 공간에서 ax00 을 가리키므로 해당 주소로 이동!
  3. ax00 으로 이동해보니 각 멤버변수별로 저장된 주소를 가리킴.. STACK으로 이동한 후 기초 타입(원시 타입)의 경우 이 주소에 값이 저장되어 있으므로 저장된 값을 불러옴..
  참조 타입의 경우 HEAP 영역 내 저장된 주소를 가리키는데 아래의 그림에서는 '대','한','민','국' 각각에 저장된 주소의 범주를 가리키는 것을 확인할 수 있다. 
*/
System.out.println(germany.name+"의 면적당 인구는 "+germany.population/korea.area+"(명/㎢)입니다.");


클래스설명합본



생성자(Constructor)

  • 생성자(Constructor)는 어떠한 클래스를 객체화할 때 반드시 한 번 실행이 되는 일종의 메서드이다. 단, 생성자는 임의로 호출할 수는 없다.
  • 어떠한 클래스 내에 그 어떤 생성자도 명시하지 않은 경우 기본 생성자가 있는 것으로 간주한다. 기본 생성자는 매개 변수가 없고, 호출부의 구문은 부모 생성자 호출)(super()) 하나로 이루어져 있다.
    public [클래스 이름](){
        super();
    }
    
  • 생성자는 정적일 수 없고, 반환 타입이 없으며(선택 사항이 아님으로 void로 명시하지도 않는다.) 구현부의 첫 구문은 반드시 부모 혹은 생성자 호출이어야만 한다.



캡슐화(Encapsulation)

  • 캡슐화(Encapsulation)는 어떤 클래스가 가지는 멤버 변수의 접근 제한자를 (상수가 아닌한) private으로 막고, 이에 접근하기 위한 Getter 및 Setter 메서드를 만드는 것을 의미한다.
  • 멤버 변수에 직접 값을 대입할 때에는 특정 로직을 실행시킬 수 없으나, Setter 메서드를 통해 값 대입을 대리하게 하면 특정 로직을 실행시킬 수 있음으로 올바르지 않은 값의 대입을 막을 수 있다.
  • 즉, 개발자간의 협동의 용이 및 실수의 방지를 위해 대부분의 필드를 가지는 클래스(Entity,DTO,VO 등)는 캡슐화되어 있다.
  • 읽기 전용(상수, final)의 경우 캡슐화를 하기도 하지만 안 해도 상관 없다.(어차피 값 대입이 안되니) 단, 값이 찹조될 때 마다 특정 로직을 작성해야 한다면 읽기 전용이라 하더라도 Getter 메서드를 만드는 경우가 있다.
  • 정적인 읽기 전용(statci final)의 캡슐화를 하지 않는다.(하면 안 된다.)



상속(Inheritance)

  • 기존에 존재하는 최종적이지 않은(final가 아닌)클래스의 기능을 그대로 가지고 추가적인 기능을 구현하기 위해 클래스를 상속받을 수 있다.
  • 상속 받을 수 있는 클래스의 개수는 한 개로 제한된다.
  • 클래스 간의 상속 구조가 순환 상속(Circular Inheritance) 구조가 되어서는 안 된다.
    public class Child extends Parent {
    // ...
    }
    

    위 구조에서 클래스 child는 클래스 Parent를 상속 받는다고 한다.

  • 별도의 상속 대상을 명시하지 않는다면 object 클래스를 상속받게 된다.








태그:

카테고리:

업데이트:

댓글남기기