본문 바로가기
[ java ]

객체지향 프로그래밍(Object-Oriented Programming)

by 히앤님 2022. 9. 26.
반응형
SMALL

객체지향 프로그래밍(Object-Oriented Programming)

좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로, 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것. 객체는 변수와 메소드를 그룹핑한 것이다. 

프로그래밍의 기본은 중복을 제거하는 것이다.덧셈 기능을 1000번 하는 것보다 "더하기"를 메소드로 만들면 코드 양도 줄어들고 문제가 발생해도 원인 파악이 쉽다. 입력값을 변수화 시키고 메소드들로 합계와 평균을 구하면 코드 양을 줄일 수 있다.

클래스

변수와 메소드가 많아지면 코드가 복잡해지게 된다. 따라서 연관되어 있는 변수와 메소드들을 함께 또 묶어서 "계산 기능"을 만든다. 이 로직들의 모임을 우리는 클래스(Class)라고 부른다.

클래스는 연관되어 있는 변수와 메소드의 집합이다.
class Calculator { // 중괄호로 영역을 표시한다. 계산 기능을 묶은 클래스
 	int left, right;
      
    public void setOprands(int left, int right){ // 변수
        this.left = left;
        this.right = right;
    }
      
    public void sum(){ //합계 내는 메소드
        System.out.println(this.left+this.right);
    }
      
    public void avg(){ //평균 내는 메소드
        System.out.println((this.left+this.right)/2);
    }
}

인스턴스

클래스는 일종의 설계도다. 클래스는 말 그대로 기능이 어떻게 동작하는지에 대한 설명이다. 이걸 사용하는 것은 new 라는 키워드와 함께한다. new Calculator()은 클래스 Calculator를 구체적인 제품으로 만드는 명령이다. 정확히는 클래스에 써있는 설계에 따라 복제본을 만들어서 복제한 클래스를 입맛대로 제품으로 만드는 것이다. 이렇게 만들어진 구체적인 제품을 인스턴스(instance)라고 부른다. 마치 데이터타입처럼, 사용자 정의의 데이터 타입의 Calculator를 만들었다고 생각하면 쉽다. 제품은 인스턴스, 설계도는 클래스 기억하기!

클래스가 구체적인 실체인 인스턴스가 되었을 때, 그것을 객체라고 부른다.

생성자

인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. new 를 통해 인스턴스 생성 시에 실행해야할 초기 작업도 여기서 진행한다. 메소드처럼 클래스 내에 선언되지만 메소드와 달리 리턴값이 없다.(메소드는 리턴값이 없으면 void를 쓰지만 생성자는 그냥 아무것도 적지 않는다)

1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.

new는 인스턴스를 생성하고, 생성자는 인스턴스 변수들의 초기화에 사용된다. (초기값을 넣어줌)

모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다. 사실, 원래 모든 클래스에는 하나씩 있어야하지만 그동안 클래스에 생성자를 정의하지 않아도 인스턴스 생성이 되었던 이유는 컴파일러가 제공하는 '기본생성자'가 있기 때문이다. 컴파일 할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우,컴파일러는 자동적으로 아래와 같이 기본 생성자를 추가하여 컴파일 한다.

클래스 이름() { }
생성자() { } //자동으로 기본 생성자 추가

생성자는 초기에 주입할 필요한 값을 전달하거나 초기에 작업을 수행 할 때 사용하며, 만드는 방법은 클래스명과 동일한 메소드에 인스턴스에서 전달한 Argument(인수,인자)를 받을 수 있는 Parameter(매개변수)를 정의하면 된다.

Class 생성자 {
	int a ;
	public 생성자(int a) {
		this.a = a;
		...
	}

    생성자 foo = new 생성자(1) { //생성할 때 1을 보내서 a에 1이 들어감
        ...
    }
}

this

this는 클래스를 통해서 만들어진 인스턴스 자신을 가리킨다. "해당 객체의" 라는 뜻. Class가 인스턴스화 했을 때 그 인스턴스를 가르키는 특수한 문자.
Calculator c1 = new Calculator();
c1.setOprands(10, 20);
c1.sum();       
c1.avg();

c1은 Calculator 라는 클래스와 new가 만나 인스턴스가 되었고, 객체 되었다. c1은 setOprands 메소드를 호출해서 10과 20의 값을 던져준다. setOprands 안에는 변수 left, right가 있는데 이 변수들은 setOprands밖에 접근하지 못하기 때문. setOprands 내부에 있는 left와 right는 this 를 통해 밖에서 전달받은 값을 할당받을 수 있다. "해당 객체의" 멤버변수임을 표시해주는 것. 얘 우리 애야!

이러면 밖에서 뭘 넣어주느냐에 따라 left, right 값이 가지고 있는 것이 달라질 수 있다. 인스턴스의 멤버들이기 때문이다. 하나의 클래스를 여러개의 인스턴스로 만들어서 사용할 수 있다.

static

static을 맴버(변수,메소드) 앞에 붙이면 클래스의 맴버가 된다.
static double PI = 3.14;

π는 3.14로 다들 알고 있는 값이다. 이걸 일일히 인스턴스들이 가지고 있기에는 비효율적이다. 이 경우엔 변수를 클래스의 멤버로 만들면 모두가 공통으로 사용할 수 있다. 클래스의 멤버이기 때문에 가져다 쓸 때마다 인스턴스를 생성할 필요가 없다.(하나의 클래스에서 여러개의 인스턴스로 값 할당하는게 아니라 그냥 꺼내쓰는 클래스 내부에 있기 때문에) 따라서 클래스 변수는 변수의 변경사항이 있으면 빌려간 모든 인스턴스에도 값이 변경된다.

출처 : 생활코딩 Java

반응형
LIST

댓글