[Java] 다시 정리하는 "클래스" - OOP, 필드

rara_kim·2022년 11월 23일
0

Java

목록 보기
33/39

객체지향 프로그래밍(OOP)이란?

현실 세계에서 어떤 제품을 만들 때 부품을 먼저 개발하고 이 부품들을 하나씩 조립해서 제품을 완성하듯, 소프트웨어를 개발할 때에도 부품에 해당하는 객체를 먼저 만든다.
그리고 객체를 하나씩 조립해서 완성된 프로그램을 만드는 기법을 객체 지향 프로그래밍(OOP: Object-Oriented Programming)이라고 한다.

객체

객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것을 말한다.  예를 들어, 자동차, 자전거, 사람과 추상적인 학과, 강의, 주문 등이 모두 객체가 될 수 있다.

객체는 속성동작으로 구성되어 있다.
사람은 이름, 나이 등의 속성과 웃다, 걷다 등의 동작이 있고, 자동차는 색상, 모델명 등의 속성과 달린다, 멈춘다 등의 동작이 있다.  자바에서는 이 속성과 동작을 각각 필드(field)메소드(method)라고 부른다.

현실 세계의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링(Object Modeiling)이라고 하는데, 현실 세계 객체의 속성과 동작을 추려내어 소프트웨어 객체의 필드와 메소드로 정의하는 과정이라고 볼 수 있다.

객체의 상호작용

현실 세계에서 사람이 전자계산기의 기능을 이용하고, 전자계산기는 계산 결과를 사람에게 알려주는 상호작용을 하는 것처럼 소프트웨어도 마찬가지이다.
객체들은 각각 독립적으로 존재하고, 다른 객체와 서로 상호작용 하면서 동작한다.
객체들 사이의 상호작용 수단은 메소드인데, 이때 객체가 다른 객체의 기능을 이용하는 것이 메소드의 호출이다.

메소드의 호출
리턴값  =  전자계산기객체 . 메소드 (매개값1,  매개값2,  ....  );

1️⃣ 객체에 도트(.)연산자를 붙이고 메소드 이름을 기술하면 된다.
     도트 연산자는 객체의 필드와 메소드에 접근할 때 사용한다.

2️⃣ 매개값은 메소드를 실행하기 위해 필요한 데이터이다.
     예를 들어, 10과 20을 주고 더하기 기능을 이용한다고 할 때 10과 20이 더하기 기능의 매개값이다.
     리턴값은 메소드가 실행되고 난 후 호출한 곳으로 돌려주는(리턴하는) 값이다.

int result = Calculator.add(10, 20);

객체 간의 관계

1️⃣ 집합 관계에 있는 객체는 하나는 부품이고 하나는 완성품에 해당한다.
     예를 들어 자동차는 엔진, 타이어, 핸들 등으로 구성되므로 자동차와 이 부품들은 집합관계라고 볼 수 있다.

2️⃣ 사용 관계는 객체 간의 상호작용을 말한다.
     사람은 자동차를 사용하므로 사람과 자동차는 사용 관계라고 볼 수 있다.

3️⃣ 상속 관계는 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성하는 관계를 말한다.
     일반적으로 상위 객체는 종류를 의미하고, 하위 객체는 구체적인 사물에 해당한다.
     예를 들어, 자동차는 기계의 한 종류인 것처럼 기계(상위)와 자동차(하위)는 상속 관계에 있다고 볼 수 있다.

객체와 클래스

클래스(class)는 객체를 만들기 위한 설계도로, 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.
클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 한다.
자동차 객체는 자동차 클래스의 인스턴스인 셈이다.

그리고 클래스로부터 객체를 만드는 과정을 인스턴스화라고 한다.
하나의 클래스로부터 여러 개의 인스턴스를 만들 수 있는데, 이것은 동일한 설계도로 여러 대의 자동차를 만드는 것과 동일하다.

객체 지향 프로그래밍 개발은 세 가지 단계가 있다.

  • 1단계는 클래스를 설계한다.
  • 2단계는 설계된 클래스를 가지고 사용할 객체를 생성한다.
  • 3단계를 생성된 객체를 이용한다.

클래스 선언

클래스 이름은 다른 클래스와 식별할 목적으로 사용되므로 자바의 식별자 작성 규칙에 따라 만들어야 한다.

규칙
하나 이상의 문자로 이루어져야 한다.  Car, SportsCar
첫 글자에는 숫자가 올 수 없다.  Car, 3Car(x)
'$', '_'외의 특수 문자는 사용할 수 없다.  $Car, _Car, @Car(x), #Car(x)
자바 키워드는 사용할 수 없다.  int(x), for(x)

클래스 이름은 한글이든 영어든 상관없지만, 한글로 클래스 이름을 만드는 경우는 거의 없다.
통상적으로 클래스 이름이 단일 단어라면 첫 글자를 대문자로 하고 나머지는 소문자로 작성한다.
만약 서로 다른 단어가 혼합된 이름을 사용한다면 각 단어의 첫 글자는 대문자로 작성하는 것이 일반적이다.

Calculator, Car, Member, ChatClient, ChatServer, Web_Browser

클래스 이름을 정했다면 클래스이름.Java로 소스 파일을 생성해야 한다.
소스 파일 이름 역시 대소문자를 구분하므로 반드시 클래스 이름과 대소문자가 같도록 해야 한다.

public class Car {

}

class Tire {
}

일반적으로 소스 파일당 하나의 클래스를 선언한다.
2개 이상의 클래스 선언도 가능한데, 2개 이상의 클래스가 선언된 소스 파일을 컴파일하면 바이트 코드 파일(.class)은 클래스를 선언한 개수만큼 생긴다.

객체 생성과 클래스 변수

클래스로부터 객체를 생성하려면 new 연산자를 사용해야 한다.

new 클래스명();

new는 클래스로부터 객체를 생성시키는 연산자이다.  new 연산자 뒤에는 생성자가 오는데, 생성자는 클래스() 형태를 가지고 있다.
new 연산자로 생성된 객체는 메모리 힙(heap) 영역에 생성된다.

new 연산자는 힙 영역에 객체를 생성시킨 후 객체의 번지를 리턴한다.
이 주소를 참조 타입인 클래스 변수에 저장해두면 변수를 통해 객체를 사용할 수 있다.

Car myCar;
myCar = new Car();

Car myCar = new Car();

클래스의 구성 멤버

1️⃣ 필드
필드는 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳이다.  선언 형태는 변수와 비슷하다.
필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.

2️⃣ 생성자
생성자는 new 연산자로 호출되는 특별한 중괄호 {} 블록으로, 객체 생성시 초기화를 담당한다.
필드를 초기화 하거나 메소드를 호출해서 객체를 사용할 준비를 한다.
생성자는 메소드와 비슷하게 생겼지만, 클래스 이름으로 되어있고 리턴 타입이 없다.

3️⃣ 메소드
메소드는 객체의 동작에 해당하는 중괄호 {} 블록이다.
메소드를 호출하면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행된다.
이때 메소드는 필드를 읽고 수정하는 역할도 하지만, 다른 객체를 생성해서 다양한 기능을 수행하기도 한다.
메소드는 객체 간의 데이터를 전달하는 수단이다.




필드(Field)

필드는 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳이다.
자동차 객체를 예로 들어보면 제작회사, 모델, 색깔, 최고 속도 등은 고유 데이터에 해당하고 현재속도, 엔진 회전 수는 상태 데이터에 해당한다.
그리고 차체, 엔진, 타이어는 부품에 해당한다. 따라서 자동차 클래스를 설계할 때 이 정보들은 필드로 선언되어야 한다.

필드 선언

필드 선언은 클래스 중괄호 {} 블록 어디서든 존재할 수 있다.
생성자 선언과 메소드 선언의 앞과 뒤 어떤 곳에서도 필드 선언이 가능하지만, 생성자와 메소드 중괄호 {} 블록 내부에는 선언될 수 없다.

타입은 필드에 저장할 데이터의 종류를 결정하는데, 기본 타입과 참조 타입이 모두 올 수 있다.
필드의 초기값은 필드 선언 시 주어질 수도 있고, 생략 수도 있다.
초기값이 지정되지 않은 필드는 객체 생성 시 자동으로 기본 초기값으로 설정된다.

필드 사용

필드를 사용한다는 것은 필드값을 읽고 변경하는 작업을 말한다.
클래스 내부의 생성자나 메소드에서 사용할 경우 단순히 필드 이름으로 읽고 변경하면 되지만, 클래스 외부에서 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용해야 한다.

class Car{
	String company = "현대 자동차";
    String model = "그랜저";
    String color = "검정";
	int maxSpeed = 350;
    int speed;
}


public class CarExample {
	public static void main(String[] args) {
    	Car myCar = new Car();
        
        System.out.println(myCar.company);    //현대 자동차
        System.out.println(myCar.model);      //그랜저
        System.out.println(myCar.color);      //검정
        System.out.println(myCar.maxSpeed);   //350
        System.out.println(myCar.speed);      //0
        
        //필드값 변경
        myCar.speed= 60;
        System.out.println(myCar.speed);     //60
    }
}

Car 클래스에서 speed 필드 선언 시 초기값을 주지 않았지만, 출력해보면 기본값인 0이 저장되어 있는 것을 볼 수 있다.

profile
느리더라도 꾸준하게

0개의 댓글