wisePocket

[JAVA] 기초문법 - ✅️객체 지향 프로그래밍(Object-Oriented Programming, OOP) - 27 본문

Java & Algorithm/Java

[JAVA] 기초문법 - ✅️객체 지향 프로그래밍(Object-Oriented Programming, OOP) - 27

ohnyong 2023. 7. 29. 20:42

객체 지향 프로그래밍(Object-Oriented Programming, OOP), Java의 필살기

객체지향프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어 개발 패러다임 중 하나, 

  객체지향프로그래밍 절차지향프로그래밍
처리방식 문제를 여러개의 객체로 나누어 처리 문제를 여러개의 함수로 나누어 처리
장점 - 코드 재사용이 용이하다
- 유지보수가 쉽다
- 대형 프로젝트에 적합하다
- 처리속도가 빠르다
- 실행 속도가 빠르다
단점 - 처리속도가 상대적으로 느리다
- 객체가 많으면 용량이 커진다
- 설계 시 많은 시간과 노력이 필요하다
- 유지보수가 어렵다
- 대규모 프로젝트에 부적합하다
JAVA, Python, C# C언어
프로그램을 여러 개의 객체(Object)들로 구성하여 개발하는 방법론을 말합니다. 각각의 객체는 데이터와 해당 데이터를 처리하는 함수들로 이루어져 있으며, 객체들 간에 상호작용하면서 프로그램이 동작하게 됩니다. 객체지향프로그래밍은 소프트웨어 개발에서 코드의 재사용성, 유지보수성, 확장성 등을 향상시키는 장점을 제공합니다.

객체지향프로그래밍에서 가장 중요한 개념들은 다음과 같습니다:

클래스(Class): 객체를 생성하는 템플릿으로, 속성과 메서드를 정의합니다.
객체(Object): 클래스의 인스턴스로, 실제 데이터와 함수를 포함합니다.
상속(Inheritance): 기존 클래스의 속성과 메서드를 새 클래스에 물려주는 기능입니다.
캡슐화(Encapsulation): 객체의 데이터와 메서드를 묶고 외부에서의 접근을 제한합니다.
다형성(Polymorphism): 같은 이름의 메서드가 다른 객체에서 다른 동작을 하도록 합니다.
객체지향프로그래밍을 활용하면 가독성과 모듈화가 증가하며, 협업과 유지보수가 더욱 용이해집니다. 

 


1. 클래스

클래스는 객체를 생성하기 위한 설계도이다.

객체를 다양하게 표현하지만
객체는 클래스에 "설계" 된 정의된 내용대로 생성된 것이라 생각한다.
객체속성(Field)과 동작(Method)으로 이루어져 있다.

자세히 말하면 클래스에서는 객체(가 생성 될 때)가 가져야 할 구성 Member가 있다.

객체의 Member 구성
1. 생성자 ( Constructor ) : 객체를 생성 할 때 호출되는 일종의 메서드 new 연산자와 함께 사용
   - 역할 : 멤버변수(인스턴스 변수)들의 초기화
   - 구성하는 방법
       - 생성자 이름은 클래스 이름과 동일해야 함.

       파라미터가 없는 것을 기본 생성자라 한다. default constructor
       public 생성자 이름(){
       }

       public 생성자 이름([매개변수(파라미터)]){
       }

      *같은 패키지에 있으면 import 없이 쓸 수 있음.(그 범위는 접근 제한자 public, private, protected)

 2. 필드==데이터가 저장되는곳==변수(Variable) 를 선언하는 것. 데이터의 타입을 지정한다 == 메모리의 크기 범위를 정한다 생각
   - 인스턴스변수(non-static변수) : 객체를 먼저 생성하고 "객체명.변수명"로 접근.
   - 클래스변수(static변수) : 메모리에 가장 먼저 올라가는 변수. "클래스명.변수명"으로 접근.


 3. 메서드(Method)==객체의 동작에 해당하는 실행 블록
   - 인스턴스 메서드(non-static메서드) :"객체명.메서드명()" 로 접근
   - 클래스 메서드(static메서드) :"클래스명.메서드명()" 로 접근


요약만 정리하여 클래스를 만들기 위해서는 4가지 STEP을 따라한다.


1. 만들려고 하는 설계도를 선언 (클래스 선언)     (Class 생성)
2. 객체가 가지고 있어야 할 속성(필드)를 정의     (변수이름과 타입 지정)
3. 객체를 생성하는 방식을 정의      (생성자-초기화-default 생성자 또는 파라미터를 받도록)
4. 객체가 가지고 있어야할 행위(method)를 정의

 

예습)

1.클래스 선언

package _06OOP;

//[1] Class를 생성 한다는 것 자체가 객체의 설계도를 만드는 것이다.
public class Prac02_HowToMakeClass {

2. 속성(필드) 정의

    //[2] 변수 초기값 선언, 할당 하기
    //[2-1] 인스턴스 변수를 선언하는 경우
    //  - 객체의 유전자, 설계도, 블루프린트라고 생각하자.
    //  - 객체명.변수명으로 가져 올 수 있다.
    int x;
    int y;
    //[2-2] 클래스 변수를 선언하는 경우
    int sum;
    static int z;

 3. 객체 생성 방식(생성자) 정의

    public _01Prac_HowToMakeClass() {
        System.out.println("이 메시지가 나타난다면 기본 생성자가 호출되고 객체가 생성된 것입니다.");

4. 메서드 정의

    //[4] 메서드(Method) 만들기 (기능, 동작)
    int Summary(int x, int y){
        //[4-2]
        sum=x+y;
        return sum;
    }
}

 


연습이 지저분해서 좀 더 직관적인 것으로 다시

차를 대상으로 작성

package _06OOP;
/*클래스를 만들기 위해서는 4가지 STEP이 필요하다.
 * -------------------------------------
 * 1. 만들려고 하는 설계도를 선언 (== 클래스 선언)
 * 2. 객체가 가지고 있어야 할 속성(필드)를 정의
 * 3. 객체를 생성하는 방식을 정의.(생성자)
 *   -constructor
 * 4. 객체가 가지고 있어야 할 행위(메서드)를 정의
 * -------------------------------------
 * */

//--------1. "Car"라는 설계도를 선언
public class Car {
    //--------2. "Car"가 가지고 있어야 할 <속성(필드) 영역>

    // 1) 고유 데이터 영역
    String company; //자동차 회사
    String model;   //자동차 모델
    String color;   //자동차 색
    double price;   //자동차 가격

    // 2) 상태 데이터 영역
    double speed;   //자동차 속도
    char gear;  //기어 상태(P, R, N, D)
    boolean lights; //자동차 조명의 상태

    // 3) 객체 데이터 영역
    Tire tire;
    Door door;
    Handle handle;



    //--------3. 객체 생성 방식 <생성자 영역>
    public Car() {
        // logic
        // 기본 생성자 : 생략이 가능
        System.out.println("Car() 기본 생성자가 호출되었습니다. 객체가 생성됩니다.");
    }

    //--------4. 메서드 영역
    //gasPedal()
    //intput : kmh
    //output : speed
    double gasPedal(double kmh){
        speed = kmh;
        return speed;
    }
    //brakePedal()
    //intput : X
    //output : speed
    double brakePedal(){
        return speed;
    }
    //changeGear()
    //intput : type(P, R, N, D)
    //output : speed
    char changeGear(char type){
        gear = type;
        return gear;
    }
    //onOffLight()
    //intput : X (<-on/off지만 작동 하냐 마냐로) !로.
    //output : lights
    boolean onOffLights(){
        lights = !lights;
        return lights;
    }
    //horn() (<- 누르면 알림 작동만 하면됨)
    //intput : X
    //output : X
    void horn(){
        System.out.println("빵빵");
    }
}

 

2. 객체 생성

위 클래스를 선언 하면서 객체의 Member 구성( 설계도 )을 정의했다.
이제 같은 패키지의 메인 클래스에서 설계도 클래스의 객체를 생성하고 대상 객체의 속성을 변경해보자.

메인-클래스의 생성자 호출-객체 생성(클래스의 속성,메서드를 가지고있음(연결되어있음))-동작 활용
package _06OOP;

public class Main {
    public static void main(String[] args) {

        Car car0 = new Car(); //<-- 클래스의 기본 생성자를 호출하여 객체를 생성했다. 인스턴스를 호출, 인스턴스화 했다고도 부른다.
        System.out.println(car0); // _06OOP.Car@251a69d7  <-- 주소값이 출력된다.
        car0.gasPedal(80.51);
        System.out.println("car0의 속도는 : "+car0.speed);

        //-------------------

        //배열로 생성해보고 각 객체의 속성을 변경 해보자.
        Car[] carArray = new Car[3];

        Car car1= new Car();
        car1.changeGear('P');
        carArray[0] = car1;
        Car car2 = new Car();
        car2.changeGear('N');
        carArray[1] = car2;
        Car car3 = new Car();
        car3.changeGear('D');
        carArray[2] = car3;

        for (Car car:carArray){
            System.out.println("car.gear : "+ car.gear);
        }


        //예습 클래스도 여기에 객체를 생성해보자.
        _01Prac_HowToMakeClass calculator1 = new _01Prac_HowToMakeClass();
        System.out.println(calculator1);
        //calculator1.toString()
    }
}

가장 중요하고 근본이 되는 부분인데,

여기서 흔들리면 뒤에 나오는 많은 내용들이 연결이 안되고 조각조각 흔들리게 된다. 집중하자.