1. Object(객체) 란?
  객체(Object)는 상태(state)와 동작(behavior)이 있는 소프트웨어 번들이다. 실세계 객체도 위의 2개의 특성(상태, 동작)으로 나뉜다. 
예를 들면, 강아지(dogs)는 상태(이름, 색, 배고픔 등)와 동작(짓는 것, 꼬리 흔들기, 달리기 등)이 있다.
자전거(bicycles)는 상태(현재 기어, 현재 속도 등)와 동작(기어 변경, 브레이크 밟기 등) 이 있다.

소프트웨어 객체

소프트웨어 객체는 실세계의 객체와 비슷하다. 소프트웨어 객체는 현재의 상태를 필드(fields or variables)라고 하고 동작을 메서드(methods or functions)라고 한다. 메소드는 객체의 내부 상태(internal state)를 표현하고 다른 객체들과 통신을 위해 사용된다. 객체의 내부상태를 숨기고 다른 객체들과 통신할 수 있는 메서드를 공개하는 것을 데이터 캡슐화(data encapsulation)라고 한다.

소프트웨어 객체로서 자전거 모델

소프트웨어 객체는 아래와 같은 이점이 있다.
 1) 모듈성(modularity)
 2) 정보은닉(information hiding)
 3) 코드 재사용(code re-use)
 4) 플러그 기능과 디버깅 용이(pluggablility and debugging ease)


2. Class(클래스) 란?
 실세계는 많은 개별 객체들로 이루어져 있다. 자전거를 예로들면 수천 종의 자전거가 있다. 하지만 각 자전거들은 동일한 설계도(blueprints)로 만들어지기 때문에 같은 구성요소들을 가지고 있다. 객체지향 개념에서는 위의 자전거를 객체 클래스의 인스턴스(instance of class of objects)라고 한다.
class는 개별적인 객체들을 만들 수 있는 설계도이다.

아래는 자전거 클래스 예제이다.

//자전거 클래스
class Bicycle { 
    //멤버변수들
    int cadence = 0;   //cadence field
    int speed = 0;      //speed field
    int gear = 1;        //gear field
    
    //케이던스 메소드
    void changeCadence(int newValue) { 
         cadence = newValue; 
    } 
    //기어변경 메소드
    void changeGear(int newValue) { 
         gear = newValue; 
    } 
    //속도변경 메소드
    void speedUp(int increment) { 
         speed = speed + increment;    
    } 
    //브레이크 메소드
    void applyBrakes(int decrement) { 
         speed = speed - decrement; 
    } 
    //상태 출력 메소드
    void printStates() { 
         System.out.println("cadence:" + 
             cadence + " speed:" +  
             speed + " gear:" + gear); 
    } 
}



//자전거 클래스를 실행시킬 수 있는 데모클래스
class BicycleDemo { 
    //JVM이 main() 메소드를 찾아 실행시킨다.
    public static void main(String[] args) { 
        // Create two different  
        // Bicycle objects 
        Bicycle bike1 = new Bicycle(); 
        Bicycle bike2 = new Bicycle(); 

        // Invoke methods on  
        // those objects 
        bike1.changeCadence(50); 
        bike1.speedUp(10); 
        bike1.changeGear(2); 
        bike1.printStates(); 

        bike2.changeCadence(50); 
        bike2.speedUp(10); 
        bike2.changeGear(2); 
        bike2.changeCadence(40); 
        bike2.speedUp(10); 
        bike2.changeGear(3); 
        bike2.printStates(); 
    } 
}



<결과>
cadence:50 speed:10 gear:2 
cadence:40 speed:20 gear:3

3. Inheritance(상속) 란?
 공통 특성들을 부모 클래스(super class)로 모으고 부모 클래스의 특성들을 상속(inherit)받아 각 서브 클래스(sub class)를 구현하는 것을 상속이라고 한다.

자전거 객체 상속

아래는 상속 관련 예제이다. Java에서는 extends 키워드를 사용하여 상속을 구현한다.

class MountainBike extends Bicycle {

    // new fields and methods defining 
    // a mountain bike would go here

}

4. Interface(인터페이스) 란?
 객체들은 외부로 노출되는 메소드를 통해 다른 객체들과 상호작용을 한다. 이런 메서드들은 외부 세계와 객체의 인터페이스를 형성한다. 예를 들면 텔레비전의 전원 버튼은 TV와 사람과 연결해 주는 인터페이스이다.
가장 일반적인 인터페이스는 관련 메소드들만 정의하고 실제 어떻게 동작하는지는 비어있다. 각 객체에서는 비어있는 인터페이스를 구현하여 해당 인터페이스가 어떻게 동작하는지를 정의한다.

아래는 인터페이스 관련 예제이다. Java에서 인터페이스는 implements 키워드를 통해 구현한다.

//Bycycle 인터페이스 정의
interface Bicycle {

    //  wheel revolutions per minute
    void changeCadence(int newValue);

    void changeGear(int newValue);

    void speedUp(int increment);

    void applyBrakes(int decrement);
}


//Bicycle 인터페이스 구현
class ACMEBicycle implements Bicycle {

    int cadence = 0;
    int speed = 0;
    int gear = 1;

   // The compiler will now require that methods
   // changeCadence, changeGear, speedUp, and applyBrakes
   // all be implemented. Compilation will fail if those
   // methods are missing from this class.

    void changeCadence(int newValue) {
         cadence = newValue;
    }

    void changeGear(int newValue) {
         gear = newValue;
    }

    void speedUp(int increment) {
         speed = speed + increment;   
    }

    void applyBrakes(int decrement) {
         speed = speed - decrement;
    }

    void printStates() {
         System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear);
    }
}

5. Package(패키지) 란?
 패키지는 관련된 클래스와 인터페이스 집합들을 관리하는 네임스페이스(namespace)이다. 개념적으로는 폴더(디렉토리)와 유사하다. 유사한 기능을 하는 클래스와 인터페이스들을 패키지로 구성하여 유지하는 것이 차후에도 관리하기가 편하다.

 

 

참조: https://docs.oracle.com/javase/tutorial/java/concepts/index.html