[Java] 클래스와 객체

sunnyboy·2025년 3월 11일

Java

목록 보기
1/4
post-thumbnail

클래스와 객체

객체

  • 실제로 존재하거나 생각할 수 있는 것
  • 현실에 있는 모든 것은 객체로 만들 수 있음.
  • 예) 학습, 홍길동
    \quad

자바에서 객체를 구현하는 방법

구현할 대상(객체)를 고려하여 클래스를 정의해야 한다.

  1. 클래스를 먼저 정의하고
  2. 정의된 클래스를 통해 객체를 만들어낸다.

왜 클래스로 먼저 정의할까?

실존하는 대상인 객체를 잘 만들기 위함이다.

\\

클래스

  • 객체로 만들 대상의 특징이나 기능을 잘 나타내도록 개념적으로 분류 정의
  • 정의된 클래스로부터 구체화하면 객체가 됨

\quad

참조 타입

기본 타입

  • 정수, 실수, 문자, 논리 값을 변수로 저장할 때 기본타입으로 분류함
  • 메모리 상에서 변수에 값이 직접 저장됨(Heap 영역)

참조 타입

  • 객체를 변수에 저장할 때 분류하는 타입
  • 객체의 메모리 주소가 변수(Static 영역)에 저장됨

참조 타입의 종류

  • 클래스, 인터페이스, 열거, 배열
    \quad

클래스 선언

클래스명 정하기

  1. 구현하고자 하는 대상을 객체로 구상하기
  2. 객체를 특징, 기능 단위로 분류해서 개념적으로 정의

이때 정의를 대표적으로 나타낼 수 있는 이름을 도출하는데, 이것이 클래스명이다.
\quad

인스턴스

인스턴스

  • Heap 메모리 영역에 객체가 생성됨
  • 정의된 클래스를 바탕으로 객체를 실체화한 것

인스턴스화

  • 인스턴스를 만드는 과정 (실체화 과정)

인스턴스를 변수에 저장하기

  • new 연산자로 생성된 인스턴스를 참조변수에 저장
// Person 클래스가 존재한다고 가정
Person person = new Person("홍길동")

메모리에서의 상황을 살펴보면,

  • 인스턴스 객체가 Heap 메모리 영역에 생성된다.
  • 이 객체의 주소가 Stack 메모리 영역에 있는 Person 변수에 저장된다.
  • Person은 참조변수가 된다.

즉, 인스턴스 변수는 항상 참조 타입 변수이다.
\quad

동일한 클래스로 인스턴스를 여러 개 만들면?

  • new 연산자는 새로운 인스턴스와 메모리 주소를 생성해 반환함.
Person person1 = new Person("홍길동")
Person person2 = new Person("임꺽정")

위와 같은 상황에서

  • person1 , person2 인스턴스가 Heap 메모리 영역에 각각 생성됨.
  • 각각의 인스턴스 주소가 Stack 메모리 영역Person1, Person2 변수에 저장된다.
  • Person1Person2참조 타입 변수이다.

이처럼 클래스가 같아도 인스턴스는 new 연산자로 생성할 때마다 별개의 새로운 인스턴스를 만들어 낸다는 것을 인지해야 한다.
\quad

객체와 인스턴스는 다르다.

  • 객체가 인스턴스를 포괄하는 개념
  • 인스턴스 : 특정 클래스로부터 메모리에 실체화된 특정 객체
  • 객체 : 개념적으로 인스턴스를 모두 포괄하는 정의
  • 예) "A 인스턴스와 B 인스턴스는 모두 객체입니다."
    \quad

메소드(Method)란?

함수

  • 하나의 기능을 수행하는 코드 블록
  • 코드가 잘 정리되어 보이고, 효율적으로 코드를 작성할 수 있음
  • 원하는 기능을 가진 함수를 필요할 때마다 호출해서 바로 사용할 수 있어 간편함
  • 중복 코드 방지

메소드

  • 클래스의 구성요소
  • 객체가 가진 하나의 동작을 정의
  • 클래스 안에 구현
    \quad

메소드 선언

메소드 구조

  1. 결과값 타입
  2. 메소드명
  3. 매개변수
    • 메소드 외부에서 받는 입력값
    • 메소드에서 필요한 입력 데이터를 받기 위해 정의한 임의의 변수
  4. 실행블록
    • 기능을 구현하는 코드
    • 중괄호 한쌍으로 묶인 블록
  5. return : 메소드 결과를 반환하는 예약어

\quad

메소드 호출

인스턴스 메소드 호출하기

  • 일반적으로 외부에서 인스턴스 메소드를 호출할 때 사용
  • 점 연산자(.) 이용함
인스턴스.메소드명(인자1, 인자2, ...)
  1. Person 클래스
 public class Person {
 	
    void whoAmI() {
    	System.out.println("홍길동 입니다.");
    }

}
  1. Person 인스턴스 whoAmI() 메서드 호출
Person person = new Person();
person.whoAmI();

내부 메소드 호출하기

내부 메소드는 점 연산자 없이 바로 메소드명으로 호출이 가능하다.

public class Person {

	void whoAmI() {
    	howOld(); // 내부 메소드 호출
    	System.out.println("홍길동 입니다.");
	}
    
    void howOld() {
    	System.out.println("20살 입니다.);
    }
    
}

\quad

필드

필드

  • 객체가 가지는 속성을 나타내는 변수

필드 선언하기

  • 필드 작성위치 : 클래스 실행 블록 바로 아래에 선언하는 것을 권장
  • 만약 클래스 메소드 내부에서 선언된다면 메소드의 지역변수가 됨
public class Person {
	String name = "홍길동";  // 필드 위치
    int age = 20;		    // 클래스 실행블록 바로 아래에 선언
    
    int getAge() {
    	return age;
    }
}

인스턴스 필드 호출하기

  • 인스턴스 외부에서 필드를 접근하고자 할 때, 점 연산자(.)을 사용
  1. Person 클래스
public class Person {
	String name = "홍길동";
    int age = 20;		  
    
    int getAge() {
    	return age; // 내부 필드는 필드명으로 바로 접근
    }
}
  1. Person 인스턴스
Person person = new Person();
System.out.println(person.age); // 점 연산자 사용

\quad

생성자

동작순서

  1. new 연산자로 객체 생성
    • 힙 메모리 상에 객체를 생성하고 해당 메모리 주소를 반환
  2. 생성자 호출
    • 객체 생성 시, 생성자가 반드시 호출됨
    • 객체를 초기화
    • 객체 내부에서 필요한 필드나 상수 등의 초기값을 설정

생성자 선언하기

  • 생성자명은 클래스 이름과 같아야 함
  • 값을 반환하는 return문을 작성하지 않음
public class Person {
	String name;
    int age;
    
    // 생성자 실행블록
    public Person(String n, int a) { // 매개변수를 받아 필드 초기값 설정
    	name = n; // 객체 초기화 코드 작성
        age = a;  //
    }
}

생성자에 매개변수 전달하기

  • 클래스 호출하는 소괄호 안에, 선언한 매개변수에 맞춰 인자를 전달
Person person = new Person("홍길동", 20);

Q. 생성자 없이 클래스를 선언한다면?

A. 디폴트 생성자

  • 클래스 내부에 생성자를 생략한 경우, 자바 컴파일러가 디폴트 생성자를 자동 추가함
  • 생성자 선언을 생략해도 정상적으로 객체가 생성된다
public class Person {
	String name = "홍길동";
    int age = 20;
    // 생성자 실행블록 생략
}
// 정상적으로 객체 생성
Person person = new Person();
profile
Data Analysis, ML, Backend 이것저것 합니다

0개의 댓글