본문 바로가기
Java

[ch06 클래스] 객체 지향 프로그래밍

by 김차루 2022. 7. 19.

 

 

📆 2022년 07월 10일

⏰ 23시 00분 ~ 22시 00분

✍ 혼자 공부하는 자바(신용권) 

 

 


 

1. 객체

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

 

🗨 예를 들어, 

물리적으로 존재하는 것 추상적으로 생각할 수 있는 것
자동차, 자전거, 책, 사람 등 학과, 강의, 주문, 등

 

- 객체는 속성동작으로 이루어져있다.

ex) 사람

속성 동작
이름, 나이, 등 웃다, 걷다

     속성 : 필드 (field)       동작 : 메소드 (method)

 

◼ 객체 모델링 : 현실 세계의 객체를 소프트웨어 객체로 설계하는 것

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

 

2. 객체의 상호작용

1) 메소드 호츨

- 현실 세계에서 일어나는 모든 현상은 객체와 객체와 객체 간의 상호작용으로 이루어져 있다.

🙍‍♀️ 사람 -> 전자계산기의 기능을 이용
📇전자계산기 -> 계산 결과를 사람에게 알려주는 상호작용

- 소프트웨어도 마찬가지.

▪ 다른 객체와 서로 상호작용하면서 동작

상호작용 수단 -> 메소드

다른 객체의 기능을 이용하는 것 -> 메소드 호출

 

2) 메소드 호출 형태

리턴값 = 전자계산기객체.메소드(매개값1, 매개값2, ...);
ex) int result = Calculator.add(10, 20);

- 객체의 상화작용 : 객체 간의 메소드 호출을 의미

-> 매개값과 리턴값을 통해서 데이터를 주고받음. 

 

3. 객체 간의 관계

- 객체는 개별적으로 사용될 수 있지만, 대부분 다른 객체와 관계를 맺고 있다. 

- 종류 : 집합 관계, 사용 관계, 상속 관계

 

1) 집합 관계

- 하나는 부품, 하나는 완성품

ex) 자동차 = 엔진+타이어+핸들+etc

     -> 자동차와 부품들은 집합 관계

 

2) 사용 관계

- 객체 간의 상호작용

- 객체 : 다른 객체의 메소드를 호출하여 원하는 결과를 얻어낸다.

ex) 사람은 자동차를 사용  -->  사람과 자동차는 사용관계

     -> 사람은 자동차를 사용할 때 달린다, 멈춘다 등의 메소드를 호출

 

3) 상속 관계

- 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성하는 관계

- 상위 객체 : 종류

- 하위 객체 : 구체적인 사물

ex) "자동차는 기계의 한 종류이다. "  -->  상위 : 기계 / 하위 : 자동차

 

객체 지향 프로그래밍

완성품인 객체를 모델링하고, 집합 관계에 있는 부품 객체와 사용 관계에 있는 개체를 설계한 후 조립하는 방식의 개발 기법

 

4. 객체와 클래스

- 현실에서 객체를 갑자기 하늘에서 떨어지는 것이 아니라, 설계도를 바탕으로 제작

 

❕ 객체 지향 프로그래밍에서도 마찬가지

- 메모리에서 사용하고 싶은 객체가 있다면 설계도로 해당 객체를 만드는 작업 필요

 

1) 클래스 & 인스턴스

클래스(class) : 자바에서의 설계도

   - 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.

 

인스턴스(instance) : 클래스로부터 만들어진 객체

    - 클래스로부터 여러 개의 인스턴스를 만들 수 있다. 

 

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

① 클래스 설계

② 설계된 클래스를 가지고 사용할 객체 생성

③ 생성된 객체를 이용

 

5. 클래스 선언

- 클래스 이름: 사용하고자 하는 객체를 구상 후, 그 객체의 대표 이름을 하나 결정

 ex) 사람 객체 : Person / 자동차 객체 : Car

 

1) 클래스 이름 작성 규칙

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

- 한글이든 영어든 상관없지만, 한글 클래스는 겅의 없다. 

- 영어의 대소문자를 구분해야 한다. 

- 단일 단어 : 첫 글자를 대문자로 하고 나머지는 소문자.

- 혼합 단어 : 각 단어의 첫글만 대문자.

 

2) 소스 파일 생성

- 소스 파일 이름 역시 대소문자를 구분하므로 반드시 클래스 이름과 대소문자가 같도록 해야 한다.

- 소스 파일을 생성하려면 소스 파일을 열고 다음과 같이 클래스를 선언한다. 

public class 클래스 이름 {

}

- public class 키워드 : 클래스를 선언할 때 사용하며 반드시 소문자로 작성

- 클래스 이름 뒤 중괄호{ } : 클래스 선언의 시작과 끝을 알려준다. 

- 보통 [ 소스 파일 1 : 클래스 1 ] 선언하지만, 2개 이상의 클래스 선언도 가능

 

6. 객체 생성과 클래스 변수

1) 객체 생성

- 클래스로부터 객체를 생성하려면 다음과 같이 new 연산자를 사용한다. 

new 클래스();

new : 클래스로부터 객체를 생성시키는 연산자

    - 클래스() 형태의 생성자가 뒤따른다. 

-> new 연산자로 생성된 객체는 메모리 힙 영역에 생성 

 

2) 객체 사용

- 메모리 내에서 생성된 객체의 위치를 모르면 객체 사용 불가.

- new 연산자는 힙 영역에 객체를 생성 후 객체의 번지를 리턴.

----> 번지를 참조 타입인 클래스 변수에 저장해두면 변수를 통해 객체 사용 가능. 아래참고⬇

클래스 변수;
변수 = new 클래스();

/* 클래스 변수 선언과 객체 생성을 1개의 실행문으로도 가능 */

클래스 변수 = new 클래스();

 

3) 예제

- Student 클래스를 선언하고 StudentExample 클래스의 main()메소드에서 Student 객체 생성

// 클래스 선언 (Student.java)
public class Student{

}
//클래스로부터 객체 생성 (StudentExample.java)
public class StudentExample{
	public static void main(String[] args){
    	Student s1 = new Student();
        System.out.println("s1 변수가 Studnet 객체를 참조합니다.");
        
        Student s2 = new Student();
        System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
     }
}

s1 변수의 Student 객체 ≠ s2 변수의 Student 객체

 

7. student와 studentexample 클래스의 용도

- 클래스에는 두 가지 용도가 있다. 

① 라이브러리(API : Application Program Interface) 용 : 다른 클래스에서 이용할 목적으로 설계
② 실행용 : 프로그램의 실행 진입점인 main() 메소드를 제공하는 역할

- 위의 예제에서는 Student가 라이브러리 클래스 이고 StudentExample는 실행 클래스이다. 

 

8. 클래스의 구성 멤버

- 클래스에는 객체가 가져야 할 구성 멤버가 선언

- 구성 멤버 : 필드(Field), 생성자(Constructor), 메소드(Method)

public class ClassName {

	int fieldname;          //필드 : 객체의 데이터가 저장되는 곳
    
    ClassName() { ... }        //생성자 : 객체 생성 시 초기화 역할 담당
    
    void methodName() { ... }  //메소드 : 객체의 동작에 해당하는 부분
    
}

 

1) 필드

- 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳

 

❌ 선언 형태는 변수와 비슷하지만, 필드를 변수라고 부르지 않는다. ❌

      - 변수 : 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸

      - 메소드 : 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재

 

2) 생성자

- new 연산자로 호출되는 특별한 중괄호{} 블록

- 객체 생성 시 초기화를 담당, 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비

- 메소드와 비슷하게 생겼지만, 클래스 이름으로 되어 있고 리턴 타입이 없다. 

 

3) 메소드

- 객체의 동작에 해당하는 중괄호{}

- 호출 시, 중괄호에 있는 모든 코드들이 일괄적으로 실행

 

⭐이때, 메소드는 필드를 읽고 수정하는 역할 + 다른 객체를 생성해서 다양한 기능을 수행

-> 메소드 : 객체 간의 테이터를 전달하는 수단, 외부로부터 매개 값을 받아 실행에 이용하고, 실행 후 값을 외부로 리턴할 수 있다. 

 

 

 

'Java' 카테고리의 다른 글

[ch06 클래스]  (0) 2022.08.04
[ch06 클래스] 생성자  (0) 2022.07.20
[ch04 조건문과 반복문]  (0) 2022.07.18
[ch05 참조타입] 열거 타입  (0) 2022.07.11
[ch05 참조타입] 배열  (0) 2022.07.11