본문 바로가기
프로그래밍언어/Java

06-1. 객체 지향 프로그래밍

by 스꼬맹이브로 2021. 1. 25.
728x90
반응형
SMALL

객체(Object)란?

물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것을 말함.

(ex : 자동차, 자전거, 책, 사람, 학과,. 강의, 주문 등)

객체는 속성과 동작으로 구성되어있으며, 각각 필드(field)와 메소드(method)로 구분함.

 

객체 모델링(object modeling)

  • 현실 세계의 객체를 소프트웨어 객체로 설계하는 것
  • 현실 세계 객체의 속성과 동작을 추려내어 소프트웨어 객체의 필드와 메소드로 정의하는 과정

<객체의 상호작용>

객체들은 각각 독립적으로 존재하고, 다른 객체와 서로 상호작용(메소드)하면서 동작

이때 객체가 다른 객체의 기능을 이용하는 것이 메소드 호출이다.

메소드 호출 형태는 다음과 같다.

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

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

2. 매개값은 메소드를 실행하기 위한 데이터

3. 리턴 값은 메소드가 실행되고 난 후 호출한 곳으로 돌려주는 값

 

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

객체의 상호작용은 객체 간의 메소드 호출을 의미하며 매개값과 리턴값을 통해서 데이터를 주고 받는다.

 

<객체 간의 관계>

객체는 대부분 다른 객체와 관계를 맺고 있다.

자동차를 예를 들어 설명해보면, 다음과 같은 그림으로 설명할 수 있다.

  1. 집합 관계 : 한쪽은 부품을 나타내고 다른 한쪽은 완성품을 나타냄
      예를 들어 자동차는 엔진, 타이어, 핸들 등으로 구성되므로 자동차와 이 부품들은 집합 관계이다.
  2. 사용 관계 : 객체 간의 상호작용을 말하며, 객체는 다른 객체의 메소드를 호출하여 원하는 결과를 얻어냄
      예를 들어 사람은 자동차를 사용하므로 사람과 자동차는 사용 관계이다. 사람은 자동차를 사용할 때
      달린다, 멈춘다 등의 메소드를 호출하는 것으로 설명할 수 있다.
  3. 상속 관계 : 상위(부모) 객체를 기반으로 하위(자식)객체를 생성하는 관계이다. 일반적으로 상위 객체는 종류를 의미하고 하위 객체는 구체적인 사물에 해당한다.
      예를 들어 자동차는 기계의 한 종류이기 때문에 기계가 상위 객체고 자동차는 하위 객체이므로
      상속 관계에 있다고 할 수 있다.

"객체 지향 프로그래밍은 만들고자 하는 완성품인 객체를 모델링하고, 집합관계에 있는 부품 객체와 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발하는 기법이다."

 

<객체와 클래스>

클래스(class)

  • 현실 세계의 설계도
  • 객체를 생성하기 위한 필드와 메소드를 정의
  • 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 함

객체 지향 프로그래밍 개발 단계

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

<클래스 선언>

사용하고자 하는 객체를 구상했다면 그 객체의 대표이름으로 클래스 생성

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

-식별자 작성 규칙

  • 하나 이상의 문자로 이루어져야 한다.
  • 첫 글자에는 숫자가 올 수 없다.
  • '$','_' 이외의 다른 특수 문자는 사용할 수 없다.
  • 자바 키워드는 사용할 수 없다.

클래스 이름을 정했다면 '클래스이름.java'로 소스파일을 생성해야 함.

소스파일을 생성하고 클래스 선언을 함.

public class 클래스이름{


}

public class는 클래스 선언 키워드로 소문자로 작성

일반적으로 소스 파일당 하나의 클래스를 선언하지만 2개 이상의 클래스 선언도 가능

2개 이상의 클래스가 선언된 소스파일을 컴파일하면 바이트 코드 파일(.class)은 클래스를 선언한 개수만큼 생성

→결국 소스 파일은 클래스 선언을 담고 있는 저장 단위일 뿐, 클래스 자체가 아님.

<객체 생성과 클래스 변수>

클래스를 선언한 다음, 컴파일을 했다면 객체 생성이 가능하다.

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

new 클래스();

new는 클래스로부터 객체를 생성시키는 연산자로 new 연산자 뒤에는 생성자가 오는데, 생성자는 클래스()형태를 가지고 있음.

new 연산자로 생성된 객체는 메모리 힙(heap)영역에 생성

생성된 객체를 사용하려면 위치를 알아야하므로 변수에 new 연산자가 리턴한 객체의 번지를 저장

//방법 1
클래스 변수;
변수 = new 클래스();

//방법 2
클래스 변수 = new 클래스();

 

예제) Student 클래스 선언후 StudentExample 클래스의 main()메소드에서 Student객체 생성

public class Student{

}
package chap06;

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 객체를 참조합니다.");
	}
}

StudentExample을 실행하면 메모리에 클래스 변수와 객체가 생성됨

Student 클래스는 하나지만 new연산자를 사용한만큼 객체가 메모리에 생성→객체들은 Student클래스의 인스턴스

여기서 s1과 s2가 참조하는 Student객체는 완전히 독립된 서로 다른 객체임.

 

**Student와 StudentExample 클래스의 용도**

클래스의 용도 두가지

1. 라이브러리용 - 다른 클래스에서 이용할 목적으로 설계

2. 실행용 - 프로그램의 실행 진입점인 main()메소드를 제공하는 역할

 

Student는 라이브러리 클래스이고 StudentExample은 실행 클래스이다.

때문에 Student에 main()메소드를 작성해서 라이브러리인 동시해 실행 클래스로 만들 수 있다.

public class Student{
//라이브러리로서의 코드(필드, 생성자, 메소드)
...
  //실행하기 위한 코드
	public static void main(String[] args) {
		Student s1 = new Student();
		System.out.println("s1 변수가 Student 객체를 참조합니다.");
		
		Student s2 = new Student();
		System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
	}
}

프로그램이 단 하나의 클래스로 구성된다면 위와 같이 작성하는 것이 좋음

하지만 대부분의 객체 지향 프로그램은 라이브러리와 실행 클래스가 분리되어있기 때문에 분리하는 것이 좋음

 

<클래스의 구성 멤버>

클래스에는 객체가 가져야 할 구성 멤버(필드, 생성자, 메소드)가 선언됨. 

각 구성 멤버들은 생략되거나 복수의 개수로 작성 가능

  • 필드 : 객체의 고유 데이터, 부품 객체, 상태 정보를 저장
    • 선언 형태는 변수와 비슷하지만, 필드를 변수라고 부르지는 않는다.
    • 변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸되지만
      필드는 생성자와 메소드 전체에서 사용되며 개체가 소멸되지 않는 한 객체와 함께 존재
  • 생성자 : new연산자로 호출되는 특별한 중괄호{} 블록
    • 생성자의 역할: 객체 생성 시 초기화 담당
    • 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 함
    • 메소드와 비슷하게 생겼지만 클래스 이름으로 되어 있고 리턴 타입이 없음
  • 메소드 : 객체의 동작에 해당하는 중괄호{} 블록
    • 메소드 이름을 가지고 있으며 메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행됨.
    • 필드를 읽고 수정하는 역할을 함
    • 다른 객체를 생성해서 다양한 기능을 수행함
    • 호출한 곳으로부터 매개 값을 받아 실행에 이용하고, 실행 후 결과 값을 호출한 곳으로 리턴할 수 있음
728x90
반응형
LIST

'프로그래밍언어 > Java' 카테고리의 다른 글

06-3. 생성자  (0) 2021.02.08
06-2. 필드  (0) 2021.01.26
05-3. 열거 타입  (0) 2021.01.24
05-2. 배열  (0) 2021.01.19
05-1. 참조 타입과 참조 변수  (0) 2021.01.18