본문 바로가기
프로그래밍/JAVA

[JAVA] Java TPC 강의 정리 (PART 1) - 객체 생성의 과정

by 소소로드 2020. 9. 16.
  • 1. 자료형의 이해
    (1) PDT (기본 자료형)
    (2) UDDT (사용자 정의 자료형)

  • 2. 객체의 생성 과정
    (1) 객체 생성 하기
    (2) private 생성자 메서드

  • 3. class / object / instance의 상호관계


1. 자료형의 이해

(1) PDT (기본 자료형) : int, boolean, float 등 컴파일러에서 기본으로 제공해주는 자료형

int a = 10; // a라는 변수에 10을 할당


(2) UDDT (사용자 정의 자료형) : 객체 자료형이라고 말하며 내가 직접 정의 하는 것이다. 
     즉, VO / DTO class, String등을 뜻한다. VO(value object)라는 이름에서도 알 수 있듯,
     VO는 값을 가진 객체를 뜻한다.

     컴파일러에 내제된 
기본 자료형만으로 내가 원하는 결과를 내기 힘들기 때문에 
     객체 자료형이라는 class를 통해 객체지향적인 콘텐츠를 구현한다.
     타입이 다 다를수 있으며 오직 하나의 데이터타입으로 통일된 배열의 개념과는 다르다. 


2. 객체의 생성 과정
(1) 객체 생성 하기

1
2
3
4
5
6
7
8
9
10
public class BookVO {
    public String title;
    public int price;
    public String company;
    public int page;
    // public BookVO { 
    //   super(); // 생략된 기본생성자
    // }
{
 
cs

class라는 도구를 이용해서 새로운 자료형을 자신이 원하는 내용으로 설계한다.

여기서 모델링이란?

BookVO class를 설계할 때  title, price, company, page, memeber, image 등등의
많은 상태정보가 존재할 수 있겠지만 꼭 필요한 속성만을
 정하고 내가 정한 title, price,
company, page이라는 속성으로 설계하는 과정이라고 볼 수 있다.

그러나 해당 소스는 class라는 설계도에 불과하며
객체를 만든다고해서 바로 메모리에 올라가는 것이 아니라
실질적으로 쓰이기 위해서는 객체를 생성해야 한다.

BookVO b = new Book();

바로 이렇게 new 연산자로 실체를 만들면 아래 그림처럼 객체가 생성된다.



            객체를 생성한다. == 그림처럼 기억 공간에 올린다.


1. 해당 BookVO
 class는 title, price, company, page가
   BookVO라는 하나의 객체에 들어간 형태이다.
2. b가 Book()의 주소를 가리키게 되고( b에 Book()이 들어가는 게 아님 )
   
 또한 b에 도트연산자를 사용함으로서 해당 내용에 접근할 수 있다. (public 일때)
3. 객체를 사용할 때는 new 연산자를 통해 Book()에 접근 할 수 있다.
4. new 연산자를 사용하게 되면 BookVO 내부에 있는 기본생성자가 
   해당 내용을 heap Area에 올리게 된다.
5. 객체가 하나 만들어질 경우, this라는 자기 자신을 가리키는 객체도 함께 만들어진다.

(2) private 생성자 메서드

위의 코드에서는 public 접근 제어를 가져서 new연산자와 도트연산자로
BookVO에 쉽게 접근을 했지만 만약 생성자 메서드가 private 접근 제어를 가지면 객체를 생성할 수 없다.
=> new 연산자로 객체를 생성하지 않고 사용할 방법은 모든 클래스의 멤버가 static 멤버가 되는 것, 이전에 설명했듯 static은 자동으로 method area에 올라가기 때문에 사용이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class learn{
 
  private learn() {
  }
 
  public void c() { // 인스턴스 메서드
    System.out.println("C언어는 너무 어렵다.");  
  }
 
  public static void java() { // 클래스 메서드
    System.out.println("java언어는 너무 어렵다.")  
  }
}
cs

* 인스턴스 메서드(non-static) :
   static이 붙어있지 않은 메서드로 객체가 생성된 뒤에 만들어지는 메서드이므로
   앞선 예제처럼 new로 객체 생성 후 접근이 가능
   그러나 접근제어가 private인 경우 c에 접근을 할 수 없다.

 
 learn a = new learn();
 
a.c(); // private 불가




* 클래스 메서드(static) :
   static이 붙어있는 메서드로 객체 생성없이 클래스 이름으로 바로 접근이 가능하며
   public, private으로도 접근이 가능하다.

 learn.java();


빠른 정리

 

 public 

 private

인스턴스 메서드(non-static)

new 연산자로 접근 가능

접근 불가능 

클래스 메서드(static)

바로 접근 가능

바로 접근 가능 

=> 쉽게 생각해서 static 멤버의 경우 굳이 new 생성자로
     강제적으로 메모리에 올리지 않아도
     자동으로 메모리에 로딩되어 올라가기 때문에
     단순히 learn.java();를 쓰는 것만으로도 learn에 있는 java를 찾을 수가 있는 것이다. 

- 이용의 효용은 인위적으로 private 생성자를 만들고 static으로 멤버를 꾸려서 
   객체생성을 막을 수도 있다. 또, 편리하게 쓰기 위해서도 만든다.


- 우리가 많이 사용하는 Math, System도 자주 사용하기에 static 멤버로 만든 것.
   System sys = new System(); 이라고 쓰지 않고, 
   System.out.println()라고 편리하게 쓰는 이유는
   그 안의 멤버들을 static으로 만들었기 때문이다.




3. class / object / instance의 상호관계

현실의 객체 =>
( Book )                      

모델링을 통해 class 생성으로 표현 =>
( title, price, company page )  

객체 object => 
( BookVO b; )  

구별되는 instance
( b = new BookVO(); )

객체생성과정 == 인스턴스를 만드는 과정