Object(객체)
현실세계에서 특정 개념을 가지고, 특정 행동을 하는 존재
어떤 속성(attributes)과 메서드(method)를 포함하는 것
Class(클래스)
객체를 만들어내는 Template
클래스 내의 모든 객체가 갖는 속성과 메서드를 정의함
객체와 클래스는 마치 쿠키와 쿠키틀 같은 존재!
instance of ~class == object
Objected-Oriented Programming(객체 지향 프로그래밍) Principle
객체들을 먼저 설계하고, 그 객체들을 모아 프로그램을 완성하는 것
즉, 먼저 객체들을 만들고 객체 사이에 일어나는 일을 구현하는 것
Object Modeling
소프트웨어 객체의 field(속성)과 method(메서드)를 정의하는 과정이 필요하다.
속성: 객체의 데이터
메서드: 객체의 행위(함수)
Encapsulation(캡슐화)
객체의 field와 method를 묶어 외부로부터 해당 객체의 실제 구현을 숨김
외부 객체(external object)는 객체의 내부 구조를 알 수 없고, 오직 허용된 field와 method에만 접근이 가능하다.
→ 객체의 손상을 방지!
private를 사용하여 숨길 수 있다.
공개를 하려면 앞에 public을 쓰거나, 생략한다.
public class Person {
int height; // 외부에서 볼 수 있음
private int weight; // 외부에서 볼 수 없음
public int showHeight() { // 외부에서 볼 수 있음
// 키 보여주는 함수
}
private int showWeight() { // 외부에서 볼 수 없음
// 몸무게 보여주는 함수
}
}
public class Test {
public static void main(String args[]) {
Person me = new Person();
me.height = 200; // 가능
me.weight = 30; // 오류 발생
me.showHeight(); // 가능
me.showWeight(); // 오류 발생
}
}
그러면 여기서 private로 선언한 weight 변수를 외부 클래스에서 사용하려면 어떻게 해야할까?
바로, private 변수인 weight를 사용할 수 있는 public 메서드를 제공하는 것!
get() 메서드(getter), set() 메서드(setter) 사용
public class Person {
int height; // 외부에서 볼 수 있음
private int weight; // 외부에서 볼 수 없음
public int showHeight() { // 외부에서 볼 수 있음
// 키 보여주는 함수
}
private int showWeight() { // 외부에서 볼 수 없음
// 몸무게 보여주는 함수
}
// getter 함수
public int getWeight() {
return weight;
}
// setter 함수
public void setWeight(int num) {
this.weight = num;
}
}
public class Test {
public static void main(String args[]) {
Person me = new Person();
me.height = 200; // 가능
me.weight = 30; // 오류 발생
me.showHeight(); // 가능
me.showWeight(); // 오류 발생
me.setWeight(100); // me의 weight를 100으로 설정
int num = me.getWeight(); // me의 weight를 가져와서 num 변수에 저장
System.out.println(num); // 100 출력
}
}
Inheritance(상속)
상속을 하는 부모 객체(parent object)와 상속을 받는 자식 객체(child object)
화살표 방향 주의하기
부모 객체가 자식 객체에게 field와 method를 전달한다.
상속을 받고 내용을 수정할 수 있다.. → 재사용성이 좋음!
상속이 효율적인 이유
클래스는 컴파일 되는데, 만약에 클래스가 두개라면 두 번 컴파일 해야한다.
그런데 클래스를 하나 만들어두고 상속을 하면 한 번만 컴파일 해도 된다.
상속을 할 때에는 extends 명령어를 사용한다.
예시) A로부터 상속받은 B
class A {
// 내용
}
class B extends A {
// 내용
}
Polymorphism(다형성)
같은 이름의 method가 있어도 다르게 작동할 수 있다.
method overloading, mehod overriding을 포함!
1. Method Overloading
input 파라미터의 data type 혹은 파라미터 개수에 따라 함수가 다르게 작동할 수 있다.
method overloading은 컴파일 과정에서 정적 다형성에 의해 결정된다.
아래의 예시를 살펴보면 이해가 쉽다.
파라미터가 int면 위의 함수를, float이면 아래의 함수를 실행한다.
public class Calculator {
public int add(int x, int y) {
// 파라미터가 int일 때
}
public double add(double x, double y) {
// 파라미터가 double일 때
}
}
2. Method Overriding
부모 클래스에서 상속 받아 자식 클래스에서 다시 정의하는 방식이다.
method overriding은 런타임의 객체 타입에 따라 동적 다형성에 의해 결정된다.
class Who {
public void about() {
System.out.println("누구야");
}
}
class Me extends Who {
@override
public void about() {
System.out.println("나야");
}
}
class You extends Who {
@override
public void about() {
System.out.println("너야");
}
}
Package(패키지)
클래스 파일의 묶음
계층 구조를 지니고 있다.
클래스 이름이 같아도 패키지 이름이 다르면 다른 클래스!
패키지 선언 예시) course 패키지 내부의 javacourse 패키지 내부의 test 패키지를 선언한 것
package course.javacourse.test;
용어 참고
용어 | 설명 |
객체 | 객체 지향 프로그램의 대상, 생성된 인스턴스 |
클래스 | 객체를 프로그래밍 하기 위해 코드로 만든 상태 |
인스턴스 | 클래스가 메모리에 생성된 상태 |
멤버 변수 | 클래스의 속성, 특성 |
메서드 | 멤버 변수를 이용하여 클래스의 기능을 구현 |
참조 변수 | 메모리에 생성된 인스턴스를 가리키는 변수 |
참조 값 | 생성된 인스턴스의 메모리 주소 값 |
참고: Do it 자바 프로그래밍 입문