Java/Java 입문

[JAVA] C7. 객체지향 프로그래밍 I

JoonYong 2023. 12. 19. 16:30
반응형
내용: 객체, 클래스, 생성자, 접근 제한 지시

1. 객체지향이란

  • 객체지향 프로그래밍(Object Oriented Programming, OOP)은 프로그래밍 패러다임 중 하나로, 코드를 객체라는 기본 단위로 나눠 설계하고 구현하는 방식을 말합니다.

객체지향 프로그래밍의  특징

  1. 캡슐화(Encapsulation)
    • 데이터와 그 데이터를 처리하는 함수를 하나의 '객체'로 묶는 것을 말합니다.
    • 이를 통해 데이터를 보호하고 코드를 보다 쉽게 관리할 수 있습니다.(은닉화)
  2. 상속(Inheritance)
    • 이미 만들어진 클래스의 속성과 메서드에 다른 클래스가 물려받아 기능을 추가하는 것을 말합니다.
    • 코드의 재사용을 촉진하고, 코드의 관리를 효율적으로 만듭니다.
  3. 다형성(Polymorphism)
    • 같은 이름의 메서드가 다른 동작을 하는 것을 말합니다.
    • 예를 들어, 같은 이름의 메서드가 입력된 인자에 따라 다르게 동작할 수 있습니다.
    • Overriding
  4. 추상화(Abstraction)
    • 복잡한 시스템을 단순화하여 효과적으로 다루기 위해 중요한 부분만을 표현하는 것을 말합니다.

객체(Object)

  • 어떤 속성기능을 가지고 있는 데이터를 말합니다.
  • 속성(필드): 객체가 가진 고유한 특성
  • 기능(메서드): 객체가 할 수 있는 동작
  • 객체는 클래스에 의해 정의되고 생성됩니다(객체의 설계도)

2. 클래스(Class)

  • 객체를 만들려면 먼저 클래스를 만들어야합니다.
  • 클래스는 객체를 만들기 위한 설계도 또는 객체를 찍어내는 틀에 비유할수 있습니다.
  • 붕어빵이 객체라면 붕어빵 틀은 클래스입니다.
public class Main {
    public static void main(String args[]){
        Turtle turtle1 = new Turtle();
        Turtle turtle2 = new Turtle();
        Turtle turtle3 = new Turtle();
    }
}
  • Turtle : 거북이 클래스(Turtle.java 제공)
  • turtle1: 거북이 객체
  • turtle2: 거북이 객체
  • turtle3: 거북이 객체

클래스 형식

public class 클래스명{  // public 접근 제한 지시

}

클래스 생성

class Rabbit{ // 새오룬 클래스 정의
    String Shape = "";
    int xPos;
    int yPos;
    
    void setPosition(int x, int y){ // 위치 변경 메서드 정의
        xPos = x;
        yPos = y;
    }
}

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

    }
}

3. 메서드의 형식

반환데이터형 메서드명(매개변수){
	// 메서드 내용
}

메서드 생성

void printSimpleText(){        
	System.out.println("초간단 메서드입니다");
}
// 반환데이터가 없다면 반환 데이터형으로 void를 사용하며,
// 메서드에 매개변수가 없다면 void를 생략할 수 있습니다.

매개변수와 반환값이 있는 메서드

int sumMehod(int num1, int num2){
	int retNumber = num1 + num2;
	return retNumber
}
int value = sumMethod(100, 200);
System.out.println("합: "+value);

4. 객체 생성

class Rabbit{ // 새오룬 클래스 정의
    String Shape = "";              // 필드 정의
    int xPos;
    int yPos;

    void setPosition(int x, int y){ // 위치 변경 메소드 정의
        xPos = x;
        yPos = y;
    }
}

public class Main {
    public static void main(String[] args){
        Rabbit rabbit1 = new Rabbit();   // 새로운 객체1 생성
        Rabbit rabbit2 = new Rabbit();   // 새로운 객체2 생성
        Rabbit rabbit3 = new Rabbit();   // 새로운 객체3 생성
       
    }
}

필드에 값 대입

class Rabbit{ // 새오룬 클래스 정의
    String Shape = "";
    int xPos;
    int yPos;

    void setPosition(int x, int y){ // 위치 변경 메소드 정의
        xPos = x;
        yPos = y;
    }
}

public class Main {
    public static void main(String[] args){
        Rabbit rabbit1 = new Rabbit(); // 새로운 객체 생성
        Rabbit rabbit2 = new Rabbit(); // 새로운 객체 생성
        Rabbit rabbit3 = new Rabbit(); // 새로운 객체 생성
        
        rabbit1.Shape = "circle";      // 객체의 속성 변경
        rabbit2.Shape = "rectangle";   // 객체의 속성 변경
        rabbit3.Shape = "triangle";    // 객체의 속성 변경
    }
}

기능(메서드) 호출

class Rabbit{ // 새오룬 클래스 정의
    String Shape = "";
    int xPos;
    int yPos;

    void setPosition(int x, int y){ // 위치 변경 메소드 정의
        xPos = x;
        yPos = y;
    }
}

public class Main {
    public static void main(String[] args){
        Rabbit rabbit1 = new Rabbit(); // 새로운 객체 생성
        Rabbit rabbit2 = new Rabbit(); // 새로운 객체 생성
        Rabbit rabbit3 = new Rabbit(); // 새로운 객체 생성

        rabbit1.Shape = "circle";      // 객체의 속성 변경
        rabbit2.Shape = "rectangle";   // 객체의 속성 변경
        rabbit3.Shape = "triangle";    // 객체의 속성 변경
        
        rabbit1.setPosition(1, 1);     // 객체의 메소드 호출
        rabbit2.setPosition(2, 2);     // 객체의 메소드 호출
        rabbit3.setPosition(3, 3);     // 객체의 메소드 호출
    }
}

5.  생성자

  • 객체지향 프로그램의 필수 요건 중 하나인 생성자를 잘 이해하면 코드의 길이가 더 짧으면서도 명확하게 코딩할 수 있습니다.
  • 생성자는 객체를 생성하면 무조건 호출되는 메서드를 말합니다.
Rabbit rabbit = new Rabbit(); // 객체 생성
rabbit.Shape = "circle";      // 객체의 모양을 초기화

 

객체를 생성하면서 모양을 초기화하면?

  • 코드가 간결해지고, 객체를 생성하면서 값을 초기화하기 때문에 속성에 초기값을 대입하는 것을 잊어버리는 일도 없을 것입니다.
  • 이렇게 각체를 생성하면서 변수의 값을 초기화하는 메서드를 생성자라고합니다.
  • 생성자도 메서드이므로 생성자 메서드라고도 부릅니다.

 

생성자 코드

  • 생성자는 클래스명과 동일하며, 생성자 앞에는 아무것도 붙지 않습니다.
  • 자동으로 shape은 토끼가 됩니다.
class Rabbit{  // 새오룬 클래스 정의
    String shape = "";
    int xPos;
    int yPos;

    Rabbit(){  // 생성자는 클래스명과 동일하며, 생성자 앞에는 아무것도 붙지 않습니다.
        shape = "토끼";
    }

    void setPosition(int x, int y){ // 위치 변경 메소드 정의
        xPos = x;
        yPos = y;
    }
}

전체 코드

class Rabbit{ // 새오룬 클래스 정의
    String shape = "";
    int xPos;
    int yPos;

    Rabbit(){ // 생성자 정의
        shape = "토끼";
    }

    //void setPosition(int x, int y){ // 위치 변경 메소드 정의
    //   xPos = x;
    //    yPos = y;
    //}
}

public class Main {
    public static void main(String[] args){
        Rabbit rabbit1 = new Rabbit(); // 새로운 객체 생성
        Rabbit rabbit2 = new Rabbit(); // 새로운 객체 생성
        Rabbit rabbit3 = new Rabbit(); // 새로운 객체 생성

        System.out.printf("토끼 객체의 기본 모양은 %S입니다.\\n",rabbit1.shape);

        //rabbit1.shape = "circle";      // 객체의 속성 변경
        //rabbit2.shape = "rectangle";   // 객체의 속성 변경
        //rabbit3.shape = "triangle";    // 객체의 속성 변경

        //rabbit1.setPosition(1, 1);     // 객체의 메소드 호출
        //rabbit2.setPosition(2, 2);     // 객체의 메소드 호출
        //rabbit3.setPosition(3, 3);     // 객체의 메소드 호출
    }
}

매개변수(파라미터)를 받는 생성자

class Rabbit{ // 새오룬 클래스 정의
    String shape = "";
    int xPos;
    int yPos;

    Rabbit(String value){ // 생성자 정의
        shape = value;
    }

    //void setPosition(int x, int y){ // 위치 변경 메소드 정의
    //    xPos = x;
    //    yPos = y;
    //}
}

public class Main {
    public static void main(String[] args){
        Rabbit rabbit1 = new Rabbit("토끼");   // 새로운 객체 생성
        Rabbit rabbit2 = new Rabbit("삼각형"); // 새로운 객체 생성
        Rabbit rabbit3 = new Rabbit("원");     // 새로운 객체 생성

        System.out.printf("토끼1 객체의 기본 모양은 %S입니다.\\n",rabbit1.shape);
        System.out.printf("토끼2 객체의 기본 모양은 %S입니다.\\n",rabbit2.shape);
        System.out.printf("토끼3 객체의 기본 모양은 %S입니다.\\n",rabbit3.shape);

        //rabbit1.shape = "circle";      // 객체의 속성 변경
        //rabbit2.shape = "rectangle";   // 객체의 속성 변경
        //rabbit3.shape = "triangle";    // 객체의 속성 변경

        //rabbit1.setPosition(1, 1);     // 객체의 메소드 호출
        //rabbit2.setPosition(2, 2);     // 객체의 메소드 호출
        //rabbit3.setPosition(3, 3);     // 객체의 메소드 호출
    }
}

매개변수명과 this

  • 만약 매개변수명을 shape으로 바꾸면 null이 출력된다
  • 매개변수가 속성보다 더 우선순위이기 때문이다.
class Rabbit{ // 새오룬 클래스 정의
    String shape = "";
    int xPos;
    int yPos;

    Rabbit(String shape){ // 생성자 정의
        shape = shape;                     // 두 shape 모두 매개변수 shape이다.
    }
}

public class Main {
    public static void main(String[] args){
        Rabbit rabbit1 = new Rabbit("토끼"); // 새로운 객체 생성
        Rabbit rabbit2 = new Rabbit("삼각형"); // 새로운 객체 생성
        Rabbit rabbit3 = new Rabbit("원"); // 새로운 객체 생성

        System.out.printf("토끼1 객체의 기본 모양은 %S입니다.\\n",rabbit1.shape);
        System.out.printf("토끼2 객체의 기본 모양은 %S입니다.\\n",rabbit2.shape);
        System.out.printf("토끼3 객체의 기본 모양은 %S입니다.\\n",rabbit3.shape);
    }
}
  • 이럴때에는 현재 클래스를 의미하는 this 예약어를 사용하면 됩니다.
  • 아래 처럼 this.shape으로 고치면 shape속성을 의미하게 됩니다.
class Rabbit{ // 새오룬 클래스 정의
    String shape = "";
    int xPos;
    int yPos;

    Rabbit(String shape){ // 생성자 정의
        this.shape = shape;                     
//(자기 클래스의 속성)  (매개변수)
    }
}

6. 접근 제한 지시자

  • 외부에서 속성이나 메서드에 접근하도록 허용할지 여부를 지정한다.
public 클래스, 패키지, 자식, 전체
protected 클래스, 패키지, 자식
없을때 클래스, 패키지
private 클래스
package  

 

private : 외부에서의 직접 접근 제한

  • private가 붙은 속성은 메서드를 통해서만 접근이 가능.
class Rabbit2{ // 새오룬 클래스 정의
    private String shape;
    private int xPos;
    private int yPos;

    void setPosition(int x, int y){ // 위치 변경 메소드 정의
        xPos = x;
        yPos = y;
        System.out.println("토끼의 위치는 (" + xPos + "," + yPos + ")입니다.");
    }

}

public class study2 {
    public static void main(String[] args){
        Rabbit2 rabbit = new Rabbit2();  // 새로운 객체 생성

        rabbit.setPosition(100,200);  // 객체의 메소드로 접근하여 속성 변경함
//        rabbit.xpos = 1000;   // 직접 접금은 불가
//        rabbit.ypos = 1000;

    }
}

 

public : 외부에서의 접근 허용

  • 외부에서 클래스 안의 속성이나 메서드에 접근할 수 있다.
  • 직접 접근 가능
class Rabbit2{ // 새오룬 클래스 정의
    public String shape;
    public int xPos;
    public int yPos;

    void setPosition(int x, int y){ // 위치 변경 메소드 정의
        xPos = x;
        yPos = y;
    }

}

public class study2 {
    public static void main(String[] args){
        Rabbit2 rabbit = new Rabbit2();  // 새로운 객체 생성

        //rabbit.setPosition(100,200);  // 객체의 메소드로 접근 하여 속성 변경함
        rabbit.xPos = 1000;             // 직접 접금 가능
        rabbit.yPos = 2000;

        System.out.println("토끼의 위치는 (" + rabbit.xPos + "," + rabbit.yPos + ")입니다.");
    }
}

 

private, public 사용 원칙

  • 속성에는 private를 붙여 외부에서 직접 접근하지 못하도록 합니다.
  • 메서드에는 public을 붙여 외부에서 자유롭게 접근가능하도록 합니다.
  • 메서드를 통해서만 속성에 접근하도록 합니다.
class Rabbit{                   // 새오룬 클래스 정의
    private String shape;
    private int xPos;
    private int yPos;

    public void setShape(String shape){  // 모양 변경 메소드
        this.shape = shape;
    }
    public String getShape(){            // 모양 조회 메소드
        return this.shape;
    }

    public void setPosition(int x, int y){   // 위치 변경 메소드
        this.xPos = x;
        this.yPos = y;
    }
    public int getX(){                       // 위치 조회 메소드
        return this.xPos;
    }
    public int getY(){                       // 위치 조회 메소드
        return this.yPos;
    }
}

public class study {
    public static void main(String[] args){
        Rabbit rabbit = new Rabbit();           // 새로운 객체 생성
        rabbit.setShape("흰토끼");              // 객체의 메소드로 접근 하여 속성 변경함
        rabbit.setPosition(100,200);            // 객체의 메소드로 접근 하여 속성 변경함

        System.out.printf("토끼 객체의 모양은 [%s]입니다.\\n", rabbit.getShape());
        System.out.printf("토끼 객체의 위치는 (%d,%d)입니다.\\n", rabbit.getX(), rabbit.getY());
		
		// 토끼 객체의 모양은 [흰토끼]입니다.
		// 토끼 객체의 위치는 (100,200)입니다.
    }
}
반응형