1.  객체 지향 프로그래밍  Object Oriented Programming

🚀  소프트웨어를 개발할 때 부품에 해당하는 객체들을 먼저 만들고, 이 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법

  ⚒️  객체지향 이론 기본 개념 : 실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용.

  ⚒️  발전 단계 : 기본자료형  →  배열  →  구조체  →  클래스

  • 구조체는 서로 다른 타입도 하나에 묶을 수 있도록 함
  • 구조체가 발전된 형태(함수까지 포함)가 클래스
70년대 -  C, 변수와 함수, 구조체
80년대 -  C++, 변수와 함수, 구조체, 클래스
90년대 -  Java, only 클래스만… 하지만 클래스안에 변수와 메서드가 있음

 

 

​  ⚒️  주요특징

 

    1.  캡슐화 Encapsulation

       

        -  객체의 데이터(필드), 동작(메소드)을 하나로 묶고 실제 구현 내용을 외부에 감추는 것

        -  외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다

        -  외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는 데 의의가 있다

        -  자바 언어는 접근 제한자를 사용하여 캡슐화된 멤버를 노출시킬 것인지 숨길 것인지 결정

 

    2.  상속 Inheritance

 

     

-  부모 객체가 자기가 가지고 있는 필드와 메소드를 자식 객체에게 물려줌

-  코드의 재사용성을 높여준다

-  유지 보수 시간을 최소화 시켜 준다

 

   

 

    3.  다형성 Polymorphism

       

 

-  사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질을 말함

-  자동 타입 변환과 재정의 기술이 필요함  ➡️  상속과 인터페이스 구현을 통해 얻어짐

 

 

 

 

 


1)  객체란 ?

  👾  물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것

  👾  객체는 속성과 동작으로 구성   ex. 사람은 이름, 나이 등의 속성과 웃다, 걷다 등의 동작이 있음

         ➡️  자바는 이러한 속성과 동작을 각각 '필드 field' '메소드 method' 라고 부름

  👾  현실 세계의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링 object modeling 이라고 함

 

객체의 상호작용
  • 현실 세계에서 일어나는 모든 현상은 객체와 객체 간의 상호작용으로 이루어져 있다.
  • 객체 지향 프로그램에서도 객체들은 다른 객체와 서로 상호작용하면서 동작함.
  • 객체들 사이의 상호작용 수단은 메소드. 객체가 다른 객체의 기능을 이용할 때 이 메소드를 호출한다.
// 메소드 호출 형식
메소드(매개값1, 매개값2, ...);
  • 메소드 이름과 함께 전달하고자 하는 데이터를 괄호() 안에 기술하는데, 이러한 데이터를 매개값이라고 함.
  • 리턴값은 메소드의 실행의 결과이며 호출한 곳으로 돌려주는 값

 

객체 간의 관계

 

  1.  집합 관계  -  완성품과 부품의 관계를 말함. 

        ex.  자동차는 엔진, 타이어, 핸들 등으로 구성

  2. 사용 관계  -  다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계

        ex. 사람이 자동차에 달린다, 멈춘다 등의 메소드를 호출

  3. 상속 관계  -  부모와 자식 관계.

        ex. 자동차가 기계의 특징(필드, 메소드)을 물려받는다면 기계(부모)와 자동차(자식)는 상속 관계에 있음


2)  객체와 클래스

🚀  클래스 Class  -  객체를 생성하기 위한 설계도

  • 클래스로부터 생성된 객체를 해당 클래스의 '인스턴스 instance' 라고 부른다
  • 클래스로부터 객체를 만드는 과정을 인스턴스화라고 함
  • 동일한 클래스로부터 여러 개의 인스턴스를 만드는 것 = 동일한 설계도로 여러 대의 자동차를 만드는 것

 ⚒️  ​객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며,  인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 구체적인 의미를 갖고 있다.

 


3)  객체 생성과 클래스 변수 

 🚀  클래스로부터 객체를 생성하려면 객체 생성 연산자인 'new' 가 필요

 🚀  new 연산자 뒤에는 생성자 호출 코드가 오는데, 클래스() 형태를 가진다.

 🚀  객체를 생성시킨 후 객체의 주소를 리턴하기 때문에 클래스 변수에 다음과 같이 대입할 수 있다.

클래스 변수 = new 클래스();

 

사용 예제
  • Student 클래스를 선언하고 StudentExample 클래스의 main() 메소드에서 Student 객체를 생성
public class Student {}
public class StudentExample {
    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println("s1 변수가 Student 객체를 참조합니다.");
        
        Student s2 = new Student();
        System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
    }
}

 

💡  클래스의 두 가지 용도
      - 라이브러리(library) 클래스 : 실행할 수 없으며 다른 클래스에서 이용하는 클래스
      - 실행 클래스 : main() 메소드를 가지고 있는 실행 가능한 클래스
      - Student는 라이브러리 클래스이고 StudentExample은 실행 클래스라고 볼 수 있음. 일반적으로 자바 프로그램은 하나의 실행 클래스와 여러 개의 라이브러리 클래스들로 구성된다. 

 


 4)  클래스의 구성 멤버

🚀  클래스 선언에는 객체 초기화 역할을 담당하는 생성자와 객체에 포함될 필드와 메소드를 선언하는 코드가 포함된다. 

 

  1.  필드 field 

     -  선언 형태는 변수 선언과 비슷하지만 쓰임새는 다름

 

  2. 생성자 constructor 

     -  new 연산자로 객체를 생성할 때 객체의 초기화 역할을 담당.

     -  선언 형태는 메소드와 비슷하지만, 리턴 타입이 없고 이름은 클래스 이름과 동일

 

  3. 메소드 method

     -  다른 프로그램 언어에서는 함수라고 하기도 하는데, 객체 내부의 함수는 메소드라고 부름

     -  메소드는 객체와 객체간의 상호 작용을 위해 호출

 


5)  필드 선언과 사용

타입 필드명 [ = 초기값];

 

  👾  반드시 클래스 블록에서 선언되어야만 필드 선언이 된다.

  👾  필드명은 첫 문자를 소문자로 하되, 캐멀 스타일로 작성하는 것이 관례.

public class Car {
    String model = "그렌저";  // 고유 데이터 필드
    int speed = 300;        // 상태 데이터 필드
    boolean start = true;   // 상태 데이터 필드
    Tire tire = new Tire(); // 부품 객체 필드
}

 

   👾  초기값을 제공하지 않을 경우 필드는 객체 생성 시 자동으로 기본값으로 초기화된다.

public class Car {
    String model;  // null
    int speed;     // 0
    boolean start; // false
    Tire tire;     // null
}

 

필드 사용

 

   👾  필드를 사용한다는 것은 필드값을 읽고 변경하는 것을 말함

   👾  필드는 객체의 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않음

   👾  필드는 객체 내부의 생성자와 메소드 내부에서 사용할 수 있고, 객체 외부에서도 접근해서 사용할 수 있다.

 

  ⚡️  객체 내부에서는 단순히 필드명으로 읽고 변경 가능

  ⚡️  외부 객체에서는 참조 변수와 도트(.) 연산자를 이용해서 필드를 읽고 변경해야 함

  ⚡️  도트는 객체 접근 연산자로, 객체가 가지고 있는 필드나 메소드에 접근하고자 할 때 참조 변수 뒤에 붙임

 

💡  참조변수에는 하나의 값(주소)만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는) 것은 가능하지만 하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 불가능

 

필드 VS 변수
구분 필드 (로컬) 변수
선언 위치 클래스 선언 블록 생성자, 메소드 선언 블록
존재 위치 객체 내부에 존재 생성자, 메소드 호출 시에만 존재
사용 위치 객체 내,외부 어디든 사용 생성자, 메소드 블록 내부에서만 사용

 

사용 예제
public class Car {
    boolean powerOn; // 시동
    String color; // 차량의 색상
    int wheel; // 바퀴의 수
    int speed; // 속력
    boolean wiperOn; // 와이퍼

    void power() {
        powerOn = !powerOn; // 시동 메서드
    }
    void speedUp(){
        speed++; // 액셀 메서드
    }
    void sppedDown() {
        speed--; // 브레이크 메서드
    }
    void wiper(){
        wiperOn = !wiperOn; // 와이퍼 메서드
    }
}
public class CarTest {
    public static void main(String[] args) {
        Car mycar; // 클래스의 객체를 참조할 수 있는 참조변수 선언
        mycar = new Car(); // 클래스의 객체를 생성하고 객체의 주소를 참조변수에 저장

        System.out.println("시동 처음 초기화 : " + mycar.powerOn);
        System.out.println("차의 색상 초기화 : " + mycar.color);
        System.out.println("바퀴의 수 초기화 : " + mycar.wheel);
        System.out.println("속력 초기화 : " + mycar.speed);
        System.out.println("와이퍼 작동 초기화 : " + mycar.wiperOn);

        mycar.power(); // 시동 메서드 실행
        System.out.println("시동 메서드 동작 : " + mycar.powerOn);
        mycar.power();
        System.out.println("시동 메서드 다시 동작 : " + mycar.powerOn);

        mycar.color = "black"; // 색상 변수에 black 대입
        System.out.println("현재 차의 색상 : " + mycar.color);

    }
}
시동 처음 초기화 : false
차의 색상 초기화 : null
바퀴의 수 초기화 : 0
속력 초기화 : 0
와이퍼 작동 초기화 : false
시동 메서드 동작 : true
시동 메서드 다시 동작 : false
현재 차의 색상 : black
 
 

 

 

*  내용 참고 - 학원강의 및 책 '이것이 자바다'

+ Recent posts