oop에서 클래스

새로운 개체를 만들 때 사용하는 명세서 개체는 반드시 클래스로부터 만들어야 함

  • 속성(상태)
  • 동작
public class Human{
    public String name;
    public int age;
    public Sex sex;

    public void walk(){
        this.age += 1;
    }
    public void eat(){
        this.age -= 1;
    }
}

접근 제어자 public

멤버 함수 변수 앞에 외부에서 클래스 내부에 담긴 상태/동작에 접근하는 것을 허용

  • 여기서 외부는 다른 패키지
//academy.pocu.character.Human.java
package academy.pocu.character;

public class Human{
    int age;
    ...
}

//academy.pocu.engine.World.java
package academy.pocu.engin;

import academy.pocu.character.Human;

public class World{
    public void SpawnNPC(){
        Human npc = new Human();
        npc.age = 20 //complie error
    }
}

상태를 칭하는 용어

  • 멤버 변수(member variable)
  • 필드(field)
  • 속성(attribute)

동작을 칭하는 용어

  • 멤버 함수(member function)
  • 메서드(method)
  • 메시지(message)

개체 만들기

Human adam = new Human//C#과 동일

adam을 개체라 지칭

객체 vs 개체

  • OOP에서 물체 생명체를 지칭 : 개체라고 번역하는게 더 나은 방법

인스턴스(instance) = 개체 = 객체 인스턴스화(instatiation): 클래스로부터 개체 하나를 만드는 행위

자바는 참조형

  • C는 개체를 포인터 혹은 값으로 전달가능
  • 자바는 무조건 포인터 전달

개체 생성시 멤버 데이터를 0에 준하는 값으로 초기화 해줌 참조형은 null로 0이 아닌 다른 값으로 초기화하고 싶다면 선언문에 대입 가능

public class Human{
    public String name;
    public int age = 20;
    public Sex sex;
    ...
}
  • .을 통해 멤버에 접근 * -> 없음

    가비지 컬렉션 기능

  • JVM에 내장되어있음
  • 메모리 수집하는 시점을 알수없음
  • 그럼에도 메모리 누수 존재

생성자

public class Human{
    public String name;
    public int age;
    public Sex sex;

    public Human(String name, int age, Sex sex){
        this.name = name;
        this.age = age ;
        this.sex = sex;
    }
}
...
Human adam = new Human("adam", 20, Sex.MALE);
  • 반환형 없음(void아님)
  • 개체 생성 시에 자동으로 호출되는 특수한 함수
  • 함수명 클래스명과 동일

코드 중복을 피하는 법

  • 매개변수 수가 적은 생성자에서 매개변수 수가 많은 생성자를 호출
  • this()를 이용하면 다른 생성자를 호출할 수 있음
public Human(String name, Sex sex){
        this(name, 0, sex)
    }

매개변수를 받지 않는 생성자가 있어야 컴파일가능.

기본 생성자(default constructor)

  • 프로그래머가 생성자를 제공하면 기본 생성자는 생기지 않음