본문 바로가기

JAVA

231215 Java 객체지향

/* 생성자
* 생성자란 클래스가 인스턴스화 되어질 때 인스턴스를 생성시켜주는 코드
*
* 생성자는 이 외에도 아래가 같은 기능이 있음
* 1. 클래스의 인스턴스 생성
* 2. 멤버 필드 초기화
* 3. 필요에 따라 초기화 메소드를 실행
*
* 생성자 없이는 인스턴스를 발생시틸 수 없음
*
* 생성자의 형식
* 메소드와 유사하게 생김. 하지만 메소드와 기능적인 부분에서 차이가 있음
* 1. 생성자 이름은 반드시 클래스 이름과 같아야 함
* 2. 메소드가 아니기 때문에 리턴 타입을 선언할 수 없음
*
* 기본 생성자 (Default Constructor)
* 자바에서는 모든 클래스마다 컴파일 시 기본 생성자를 자동으로 넣어줌
* 단, 클래스에 생성자가 하나라도 있으면 기본 생성자를 제공하지 않음
* 기본 생성자는 파라미터가 없는 생성자를 말함
* 기본 생성자를 통해 생성된 객체를 기본 객체라고 함, 또한 모든 필드 값은 기본 값으로 초기화
*/
class Apple {
    String name;
    int age;
    int money;
    Apple() { // 기본 생성자, 리턴 타입이 없어 생성자 역할을 함
        System.out.println("생성자가 동작합니다.");
    }
    Apple(String name) { // 생성자
        this.name = name;
    }

    Apple (String name, int age) { // 생성자, 파타미터에 변수가 들어감
        // this.name = name; name 만 사용하는 생성자를 호출하는 것으로 대신할 수 있음
        this(name); // Apple(String name) 생성자 호출
        this.age = age;
    }
    Apple (int age, String name) { // 위 생성자와 다른 생성자, 위치가 다르면 다른 생성자로 인식
        this.name = name;
        this.age = age;
    }

    Apple(String name, int age, int money) {
        // this.name = name;
        // this.age = age;
        this(name, age); // Apple (String name, int age) 생성자 호출
        /*
        * 같은 클래스에서 정의된 다른 생성자를 호출하는 키워드 this(type)
        * 호출하려는 새엇ㅇ자의 파라미터 순서에 맞게 호출하면 자동 호출
        * this 생성자 호출은 생성자 첫 머리에서만 호출 가능
        * 딱 한 번만 호출 가능
        */
        this.money = money;
    }

/* 생성자(메소드) 오버로드/오버로딩
 * 같은 이름의 메소드 또는 생성자를 정의할 때
 * 같은 지의 판별요소로 적용되는 기준을 메소드/생성자 시그니쳐라고 함
 * 시그니쳐는 파라미터의 개수, 순서, 타입이 모두 같을 때 같은 생성자/메소드 라고 인지
 * 하나라도 다르다면 다른 메소드/생성자로 인식합니다.
 * 호출 시 호출하는 파라미터의 시그니쳐를 보고 해당 생성자/메소드를 동적으로 호출
 * 이렇게 같은 이름의 생성자/메소드를 시그니쳐만 다르게 하여
 * 정의하는 기술을 오버로드/오버로딩 이라고 함
 */
    void Apple() {} // 클래스와 같은 이름이지만 메소드 역할을 함
    // 생성자는 리턴 타입이 없기 때문에 생성자가 될 수 없음

    int sleep() {
        return 0;
    }
}
public class Constructor01 {
    public static void main(String[] args) {
        Apple apple = new Apple(); // 생성자가 동작합니다. 출력
        apple = new Apple("홍길동", 1);
        Apple apple2 = new Apple("김길동");
        Apple apple3 = new Apple("김길동", 1);
        Apple apple4 = new Apple(120, "김길동");
        Apple apple5 = new Apple("김길동", 1, 20000);
    }
}

 

Getter 와 Setter

package com.poseidon.constructor; // Human 클래스가 들어있는 패키지

public class Human {
    String name;
    int age;
    String addr;
    int money;

    public Human() { }

    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { // get 은 리턴 타입이 있음
        return name;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) { // set 은 리턴이 없음, 파라미터가 있음
        this.money = money;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }
    public void setName_Age(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

Human 클래스를 사용하는 다른 패키지의 클래스

package test; // 다른 패키지

import com.poseidon.constructor.Human; // 패키지 주소와 클래스 이름까지 import

public class Test01 {
    public static void main(String[] args) {
        Human h1 = new Human("홍길동", 15);
        // System.out.println(h1.name);
        // Human 클래스에서 h1.name, name 이 public 이 아니라 호출 불가
        // 대신에 Getter, Setter 사용, Human 클래스에 Getter, Setter 메소드 생성
        System.out.println(h1.getName()); // 홍길동 출력
        h1.setMoney(3000);
        System.out.println(h1.getMoney()); // 3000 출력
        h1.setAddr("서울시 서대문구");
        System.out.println(h1.getAddr()); // 서울시 서대문구 출력
        h1.setName_Age("홍홍길동", 150);
    }
}

 

 

 

 

질문

- class 앞에 public 이 없고 메소드에 public 이 있으면 메소드만 패키지 외부에서 사용 가능한지

답 : class 가 외부로 나가지를 못하니 메소드도 외부에서 호출 불가능

 

setter 는 한번에 여러 개 설정이 가능한데 getter 는 한번에 여러 개 리턴이 가능한 지

답 : 리턴은 한번에 하나만, 여러 개 리턴이 필요 할 경우 배열이나 다른 방법으로 해야 함

'JAVA' 카테고리의 다른 글

231219 Java  (0) 2023.12.19
231218 Java  (0) 2023.12.18
231214 Java 객체지향  (2) 2023.12.14
231213 Java  (0) 2023.12.13
231212 Java  (0) 2023.12.12