[JAVA] 객체, 생성자

    객체

    - 상태와 행동으로 구분될 수 있는 모든 것들은 객체가 될 수 있다.

    - 객체를 생성하기 위해서 class 필요

    - 하나의 class로 여러 개의 객체를 생성

    - 객체 생성을 위한 class는 생성하고자 하는 객체의 모양과 같아야 한다

         ==> 생성하고자 하는 객체가 무엇인지부터 구체적으로 모델링 해야함

         ==> 생성하고자 하는 객체들의 공통된 데이터 구조와 기능을 추출해서 class 생성

    - 같은 class를 통해 생성된 여러 개의 객체는 형태는 같지만 서로 다른 객체이다

    - 객체는 만들고 싶은 만큼 만들 수 있다




    객체 생성을 위한 class

    - 메소드와 변수(=멤버메소드와 멤버변수)는 객체를 생성해야만 사용할 수 있다.

         ==> 멤버메소드와 멤버변수 자체만으로는 메모리를 할당받지 않은 상태이기 때문

    - 객체 생성: 객체=new 클래스이름

         ==> 인스턴스화(객체를 생성하는 다른말). 객체에 저장되는 것은 주소값

         ==> 생성된 객체들은 서로 다른 독립된 메모리를 할당 받음 = 저장된 주소값이 다름.

                   즉, class 내의 정의된 변수에 객체마다 다른 값을 저장하는 것이 가능하다

         ==> 객체 생성 후, class 내의 변수나 메소드에 접근하려면,

                   객체.변수 / 객체.메소드 ------객체가 주소값을 갖고 있기 때문

                   객체에 언제든지 접근가능
         
         

    - 객체의 데이터 타입= class 타입(레퍼런스 타입)







    생성자

    - 생성자의 역할

         객체를 초기화 함(변수), 멤버변수 초기화

    - class 이름과 같아야 함 (메소드처럼 선언)

         ex)


    class GoodsStock {

         String goodsCode;

         int stockNum;




         GoodsStock(String code, int num) {

              goodsCode = code;

              stockNum = num;

         }

    - 디폴트 생성자 : 생성자를 선언하지 않으면 JVM이 자동으로 생성. 파라미터를 받지 않고, 내용이 없음.

         => 생성자를 따로 선언하면 디폴트 생성자가 자동으로 선언되지 않음. (수동으로 디폴트 생성자 선언하는 습관 필요) 

    (.을 통해서)
    - 생성자를 통하면 여러개의 객체를 초기화하는데 중복되는 코드를 줄여줄수 있음. 


    생성자와 메소드의 차이

         - 생성자는 리턴형을 사용하지않는다
         - 생성자는 class 이름과 같다



    - 생성자에서 파라미터는 초기화하고자 하는 만큼

    - 생성자의 타입 (파라미터) 에 없는 객체는 생성할 수 없음
         ex. 생성자가 3개면 객체를 3개 만들수있다.



    소스코드




    1. 객체 생성 기본

    1-1. 객체 class (생성자, 디폴트 생성자 포함)



    package oop;

    public class Account {

    //공통된 데이터구조

    //[계좌번호, 계좌주, 잔액] = 상태 =멤버변수

    String accountNum;

    String ownerName;

    int balance;

    public Account(String accountNum, String ownerName, int balance) {

    this.accountNum = accountNum; // 멤버변수와 로컬변수가 같을 때,

    this.ownerName = ownerName; // 'this.변수'를 쓰면 멤버변수를 지칭

    this.balance = balance;

    }

    public Account() {
    } // 디폴트 생성자

    //공통된 기능 = 행동 = 멤버메소드

    //입금하다, 인출하다

    public void deposit(int amount) {

    balance += amount;

    }

    public int withdraw(int amount) throws Exception {

    if (balance < amount) {

    throw new Exception("잔액 부족");

    }

    balance -= amount;

    return amount;

    }

    @Override

    public String toString() {

    return "Account [accountNum=" + accountNum + ", ownerName=" + ownerName + ", balance=" + balance + "]";

    }

    }



    1-2. 객체 생성(메인 메소드 포함한 class)


    package oop;

    public class AccountMain {

    public static void main(String[] args) {

    Account account1 = new Account();

    account1.accountNum = "11111-11111";

    account1.ownerName = "홍길동";

    account1.balance = 10000;

    account1.deposit(5000);

    /*
    * System.out.println("계좌번호: " + account1.accountNum);
    * System.out.println("예금주: " + account1.ownerName);
    * System.out.println("잔액: " + account1.balance);
    */

    System.out.println(account1);

    try {

    account1.withdraw(20000);

    } catch (Exception e) {

    System.out.println(e.getMessage());

    }

    }

    }

    댓글