Java Study #6

allzeroyou·2022년 1월 28일
0

Java

목록 보기
6/14

1. 클래스와 객체의 개념

자바는 객체지향형 프로그래밍 언어로 클래스, 추상 클래스, 인터페이스와 같은 객체지향적 문법 요소를 사용해 프로그램을 구성한다. 자바를 제대로 이해하려면 이러한 문법 요소를 이해해야 한다. 기본 문법 요소인 클래스에 관해 알아보자.

1-1. 클래스의 개념

  • 객체(object)는 사용할 수 있는 실체
  • 클래스는 객체를 만들기 위한 설계도
    => 1개의 정의된 클래스를 이용해 여러 개의 객체를 만들 수 있다.

클래스는 왜 사용할까?

프로그램 문법 요소의 발전 과정
변수배열구조체클래스

  • 변수
    다양한 형태의 데이터를 저장하기 위해 각각의 데이터를 저장할 수 있는 변수라는 문법 요소를 만들어 사용
  • 배열
    데이터의 종류가 많아질수록 데이터의 개수만큼 변수명을 짓거나 관리하는 일이 버거워졌다. 이런 문제를 해결하기 위해 만든 문법 요소가 '배열'이다. 배열을 사용하면 같은 자료형인 변수들을 묶어 1개의 새로운 자료형으로 관리할 수 있어 관리해야 할 변수의 개수를 줄일 수 있음
  • 구조체
    배열은 같은 자료형끼리만 묶을 수 있으므로 반 학생들의 성적(int)과 반 평균(double)은 1개의 배열로 관리할 수 없다. 한 반의 성적 데이터를 한 번에 관리하면 훨씬 효율적일 것. 이를 보완하기 위해 만든 문법 요소가 '구조체'이다. 구조체를 사용하면 서로 다른 자료형도 1개의 자료형으로 묶어 관리할 수 있음.
  • 클래스
    이렇게 다양한 자료형의 데이터를 하나로 묶어 관리할 수 있는 구조체는 말 그대로 데이터만 묶어 놓은 것. 여기에 반 평균 성적을 출력, 계산하는 등과 같은 기능을 추가하면 성적과 관련된 모든 내용을 효율적으로 처리할 수 있다. 이것이 바로 클래스이다. 즉, 클래스는 다양한 자료형의 데이터를 묶어 관리할 수 있을 뿐만 아니라 데이터를 처리하는 다양한 기능까지 함께 관리하는 문법 요소.

1-2. 절차지향과 객체지향 이해하기

  • 절차지향형 프로그래밍(PP: Procedural Programing)
    순서에 맞춰 단계적으로 실행하도록 명령어를 나열

  • 객체지향형 프로그래밍(OOP: Object-Oriented Programing)
    객체 단위로 프로그램 수행

    각 객체에 속한 데이터는 속성또는필드라고 한다.
    객체지향형보다 절차지향형이 더 좋아보이는가?
    자동차 1대에 운전자 2명이 교대로 운전하는 프로그램 구조를 생각해보자.
    객체지향형은 운전자객체를 1개 더 추가, 전진하기정지하기기능을 호출하기만 하면 끝.
    반면에 절차지향형은 어떤 절차, 어떤 기능, 어떤 순서대로?

자바에서 제공하는 객체지향 문법 요소

크게 클래스인터페이스가 있다.
클래스는 다시 일반클래스추상클래스로 나뉜다.

객체지향 문법 요소는 객체의 생성과 관련된 요소라 생각하면 된다. 다시 말해 클래스나 인터페이스를 활용해 객체를 직,간접적으로 만들고, 이를 활용해 프로그램을 실행.

1-3. 클래스 구조

  • 클래스명은 class 키워드와 함께 표기
  • 대문자로 시작하는 것이 관례

A라는 이름의 클래스를 포함하는 자바 소스 파일 A.java의 구조

package ...; //	1. 패키지
import ...; // 2. 임포트
class 클래스명 {...} // 3. 외부 클래스

public class ... { 
	int a = 4; // 1. 필드(파일명과 동일)
	double abc( ) {..} // 2. 메서드
	A( ) {...} // 3. 생성
	class 클래스명 {...} // 4. 이너 클래스
}

자바 소스 파일은 클래스의 외부 구성 요소와 내부 구성 요소로 나눠 생각 가능

클래스의 외부 구성 요소

  1. 패키지: 프로젝트를 생성할 때 패키지를 지정했다면 패키지명이 포함, 반드시 주석을 제외하고 첫 번째 줄에 위치해야! 클래스 생성 과정에서 생성하지 않았다면, 즉 디폴트 패키지를 사용하면 생략됨.
  2. 임포트: 다른 패키지의 클래스를 사용하고자 할 때 포함됨.
  3. 외부 클래스: 클래스의 외부에 또 다른 클래스가 포함될 수 있다. 즉 1개의 .java 파일에 여러 개의 크래스가 포함 가능. 단, 외부 클래스에는 public 키워드를 붙일 수 없음.

클래스의 내부 구성 요소

  1. 필드: 클래스의 특징(속성)을 나타내는 변수. 만약 이 클래스가 한 사람에 관한 정보를 담고 있다면, 필드 값으로 나이 등이 포함 가능.
  2. 메서드: 클래스가 지니고 있는 기능(함수)임. 한 사람에 관련한 클래스라면 일하기(void working() {...}등이 포함 가능)
  3. 생성자:생성자(A(){...})는 클래스의 객체를 생성하는 역할.
  4. 이너 클래스: 클래스의 내부에도 클래스가 포함 가능.
    생성자를 제외한 3가지 요소를 클래스의 멤버라고 한다.

1-3. 클래스 vs 객체

클래스 = 붕어빵 기계

객체 = 붕어빵

붕어빵을 먹고싶다고 해서 붕어빵 기계를 먹을 수는 없다.
붕어빵과 앙꼬를 먹고싶다면 붕어빵 기계에서 찍어 나온 붕어빵을 먹어야 한다.
클래스를 직접 사용할 수는 없지만, 클래스의 모든 특징(필드)과 기능(메소드)들을 사용하려면 클래스를 이용해 객체를 만든 후 그 객체 속의 필드와 메서드 등을 사용해야!

  • 클래스에서 객체로 만드는 과정은 생성자가 수행
  • 클래스의 생성자로 객체를 만드는 과정을 '인스턴스화'라고 한다.
  • 인스턴스화로 만들어진 객체를 '인스턴스'라고 한다.
    -객체(붕어빵)속엔 클래스의 내부 구성 요소 중 생성자를 제외한 나머지 요소가 포함돼어 있는데 이를 '인스턴스 멤버'라고 한다.
  • 클래스는 바로 사용할 수 없고 반드시 객체를 생성해 객체 안에 있는 필드, 메소드 및 이너 클래스를 사용해야 한다.

2-1. 객체의 생성과 활용

  • 클래스로 객체를 생성하고 활용하는 방법
  • =붕어빵 기계(클래스)에서 붕어빵을 찍는 방법(객체 생성)과 붕어빵을 맛있게 먹는 방법(객체의 활용 방법)을 알아보자.

객체 생성

객체는 new 키워드로 생성 가능.
자바에선 대부분의 클래스가 이 방법으로 객체 생성
클래스에 따라 메소드를 사용해 객체를 생성할 때도 있지만 이때도 해당 메서드 내부에서 new를 사용해 객체를 생성한다.

  • 즉, 모든 클래스가 new 키워드로 객체를 생성

클래스 명 참조 변수명 = new 생성자();
A a = new A();

객체 생성 코드를 구성하는 요소는 클래스명, 참조 변수이다.

참조변수는 실제 데이터를 저장하는 것이 아닌, 실제 데이터가 있는 힙 메모리의 위치값을 가르키는 변수

생성자는 클래스와 이름이 동일하지만, 뒤에 소괄호가 있음. 이 생성자가 실행되면 클래스의 객체 생성.
따라서 new는 생성자의 결과물로 나온 객체를 힙 메모리에 넣는다.

실제 데이터를 저장하고 있는 객체를 힙 메모리의 어느 위치에 넣었는지 알려 주지 않으면 그 객체를 ㅆ르 방법이 없다.
따라서 힙 메모리에 실제 객체를 넣을때 그 위치값을 참조변수에게 알려주는 것이다
위 객체 생성 예시에 포함된 코드를 다시 말로 표현하자면 A() 생성자로 만든 객체를 힙 메모리에 넣고 위치값을 A타입 참조 변수 a에 저장해! 라고 표현가능.

객체 생성에 따른 메모리 구조

객체를 생성했을때 메모리에 어떻게 저장될까?

클래스 A는 메모리의 클래스 영역, 참조 변수는 스택 영역에 들어간다. 내부 공간에는 실제 데이터(객체)의 위칫값을 저장.
생성자로 만들어진 객체는 힙 메모리에 위치. 객체 내부에는 클래스의 멤버(필드, 메서드, 이너 클래스)가 위치. 객체에 포함된 3가지 요소가 사용할 수 있는 상태가 된 것임. 메서드를 살펴보면 실제 메서드 구현 코드는 클래스 영역 안에 저장해 놓고, 객체 안에서 메서드 영역의 위치만 가리키고 있다는 것을 알 수 있다. 그 이유는 1개의 클래스로 만든 모든 객체는 속성(필드)은 달라도 기능(메소드)은 동일하기 때문이다. 즉, 객체를 100개 만들어도 메서드는 단 한번만 만들면 된다.

자동차 클래스로 빨간색 자동차, 파란색 자동차 하나씩 만들기

자동차 클래스로 빨간색 자동차 객체와 파란색 자동차 객체를 만들면 힙 메모리에 각 객체가 저장된다.
빨간색 자동차의 color 속성값은 'red', 파란색 자동차의 color 속성값은 'blue'라고 가정해보자. 둘다 drive() 기능이 있어야 하므로 두 객체 안에 drive() 메서드가 포함되어 있어야 한다!
그런데 각 객체에 포함돼 있는 drive() 메서드 코드가 동일하므로 이를 메서드 영역에 1개만 만들어 두고 모든 객체가 공유!

=> 동일한 클래스로 만든 객체들은 기능(메서드)의 내용이 동일하므로 메서드 공유가능

예제로 메모리 구조 살펴보기

클래스 A에는 필드 1개와 메서드 1객 ㅏ있다. 필드 값 m은 3으로 초기화, print() 메서드는 간단한 문자열 출력.

생성된 객체에서 필드값은 실제 저장 공간이 객체 내부에 있고, 메서드는 메서드 영역에 있는 1개의 메서드만 공유 하고 있음을 기억하자

2-2. 객체 활용하기

객체 내부의 멤버를 사용한다는 의미. 필드를 사용한다는 것은 필드에 값을 넣거나 읽어온다는 것, 메서드를 사용한다는 것은 해당 메서드를 호출하는 것을 말한다.

포인트 연산자 사용하기

자바에서는 힙 메모리에 직접 접근할 수 있는 방법이 없으며, 위치 정보를 포함하고 있는 참조 변수를 이용해 객체 접근 가능. 이때 사용하는 것이 포인트 연산자(.)이다. '해당 위치에 있는 객체 안을 보라!'

필드와 메서드의 활용)
참조 변수명. 필드명()
참보 변수명. 메소드명()

A a = new A( );
System.out.println(a.m;) //필드 활용
a.print( ); //메서드 활용

클래스 구성과 객체의 생성 및 활용

package chap6;

class A { // 클래스(붕어빵 기계) 정의
	int m = 3;
	void print() {
		System.out.println("객체 생성 및 활용");
	}
}
public class CreateObjectAndUsageOfMembers {
	public static void main(String[] args)
	{
		// 클래스로 객체(붕어빵) 생성
		A a = new A();
		
		// 클래스 멤버 활용(붕어빵 잘 먹기)
		//@필드 활용: 필드에 값을 읽기/쓰기
		a.m = 5;
		System.out.println(a.m);
		
		// @메서드 활용: 메서드를 호출
		a.print();
	}
}

📕 참고문헌) Do it! 자바 완전 정복!

profile
모든 건 zero 부터, 차근차근 헛둘헛둘

0개의 댓글