JAVA - 5 : 클래스

Seok-Hyun Lee·2021년 6월 9일
0

JAVA

목록 보기
5/21

5 클래스

5.1 클래스란

5.1.1 객체 지향 프로그래밍


우리가 흔히 얘기하는 클래스는 객체 지향 프로그래밍에서 중요한 요소이다. 객체 지향 프로그래밍은 모든 데이터를 객체(Object)로 취급하고 이를 프로그래밍의 중심으로 두는 방법이다. 객체란 실생활에서 우리가 인식할 수 있는 사물과 같은 개념으로 이해하면 된다. 즉, 상태(state)와 행동(behavior)이 구체화된 형태가 된다.

5.1.2 클래스

자바에서 클래스란 객체를 정의하는 틀 또는 설계도와 같은 의미이다. 즉, 클래스에 해당 객체의 상태와 행동에 관련된 정보를 작성하고 이를 토대로 여러 객체가 만들어진다.

클래스에는 객체의 상태를 나타내는 필드(fieldf)와 행동을 나타내는 메소드(method)로 구성되어 있고 정의하는 방법은 아래와 같다.

public class Car {
	// 필드
    int field;
    // 생성자(기본값은 생략되어있음)
    public Car() {
    }
    // 메소드
    public void print() {
    }
}

그리고 자바에서는 일반적으로 하나의 클래스당 하나의 .java 파일을 만들지만 .java 파일 자체에 두 개 이상의 클래스도 선언이 가능하다.

5.1.3 클래스의 요소들

필드

  • 객체 고유의 데이터
  • 상태 정보 저장
  • 객체가 생성되면 초기화
  • 객체가 소멸되면 같이 소멸

생성자

  • 반드시 클래스 내부에 존재
  • 선언 생략 가능, Overload 가능
  • new 연산자로 호출, 리턴 타입 명시 없음
  • Heap 영역에 객체 생성
  • 생성된 객체 주소 반환

메소드

  • 객체의 행동
  • 접근 제어자, 리턴 타입, 메소드 명, 매개변수, 중괄호 블록 구성
  • 필드의 변수들 활용 가능

5.2 객체 만드는 방법

클래스는 객체의 상태와 행동에 관한 틀을 제공하는 것이니 실제로 객체를 만들어 활용하기 위해서는 아래와 같이 new 연산자를 사용해야 한다.

Car tesla = new Car();

이때 new 연산자는 앞서 클래스에서 소개한 생성자를 호출하고 생성자는 객체 주소를 반환한다. 그래서 tesla 라는 Car 타입 변수는 참조형 변수가 되는것이고 tesla 객체가 Car 클래스를 활용해서 초기화되는 과정을 클래스의 인스턴스화라고 한다. 그리고 만들어진 객체를 인스턴스라고 부른다.

5.3 메소드 정의하는 방법

메소드는 클래스 내부에서 앞으로 생성될 객체의 행동을 의미하고 크게 선언부와 구현부로 나뉘어 있다. 아래는 이의 예시이다.

public int add(int num1, int num2 ) {
	return num1 + num2;
}

이처럼 메소드를 정의할 때는 정해진 규칙이 있다.

접근제어자 반환타입 메소드명 (매개변수) { // 선언부
	// 구현부 
}
  • 접근 제어자 : 해당 메소드에 접근할 수 있는 범위를 명시합니다.
  • 반환 타입(return type) : 메소드가 모든 작업을 마치고 반환하는 데이터의 타입을 명시합니다.
  • 메소드명 : 메소드를 호출하기 위한 이름을 명시합니다.
  • 매개변수(parameters) : 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시합니다.
  • 구현부 : 메소드의 고유 기능을 수행하는 명령문의 집합입니다.

5.3.1 오버로드(Overload)

오버로드란 동일한 메소드 명에서 매개변수의 개수나 타입을 다르게 하여 기존과는 다른 데이터 인풋을 활용하는 행동을 새롭게 정의하는 것을 의미한다.

public int age() {
	return 2021;
}

// 메소드 오버로딩
public int age(int num){
	return 2021 + num;
}

위의 두 메소드는 이름은 동일하지만 매개변수가 다르기 때문에 필요로하는 데이터의 형태가 다르다 그렇기에 서로 구분이 되는 메소드로 활용이 되고 구현부도 다르게 만들 수 있다.

이러한 기능을 활용하는 이유는 매개변수들을 다양하게 받아 하나의 메소드 명으로 다양한 처리를 할 수 있게 하여 메소드 이름을 절약할 수 있을 뿐만 아니라 사용자는 하나의 메소드 이름만으로 매개변수에 구애받지 않고 특정한 행동을 사용할 수 있다는 장점이 있다.

  • 매개변수 이름 절약(Grouping)
  • 매개변수에 구애 받지 않는 기능

5.4 생성자 정의하는 방법

클래스의 객체가 만들어지면 해당 객체는 메모리에 즉시 생성되고 필드 멤버들 또한 자동으로 기본값으로 초기화된다. 하지만 사용자가 원하는 값으로 초기화하기 위해서는 생성자라는 것을 사용해야 한다.

5.4.1 생성자

객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화하는 생성자는 다음과 같은 특징을 같는다.

  • 생성자명은 클래스명과 같다
  • 반환값이 없지만 void로 명시하지 않는다.
  • 인스턴스 변수 초기화를 위한 매개변수 전달받기
  • 하나의 클래스에 여러개의 생성자 가능

5.4.2 기본 생성자

자바에서 모든 클래스는 하나 이상의 생성자가 반드시 존재해야 한다. 하지만 생성자를 특별히 명시하지 않아도 인스턴스를 생성할 수 있다. 왜냐하면 자바 컴파일러가 기본 생성자라는 것을 기본적으로 제공해주기 때문이다.

클래스이름(){}

이때 기본 생성자는 위와 같이 어떠한 매개변수나 동작에 대한 명시가 없다. 그래서 기본 생성자만 있는 클래스는 객체를 생성할 때 초기화가 명시되지 않은 필드 멤버의 변수들은 기본값으로 초기화 시켜준다.

하지만 만약 매개변수를 가지는 생성자(메소드 오버로딩)를 하나라도 정의하며 기본 생정자는 자동으로 추가되지 않고 호출을 할 시 오류가 발생한다.

class Car{
	String name;
	int color;
    
	Car(String name, int color){
    	this.name = name;
        this.color = color;
    }
    	
}

5.5 this 키워드

  • this 키워드는 생성된 객체 자신을 의미
  • 인스턴스의 주소가 저장
  • 객체 내부에서 필드 접근을 위해 this 키워드 활용
  • 생성자 내부 첫 줄에서 this로 다른 생성자 호출 가능
profile
Arch-ITech

0개의 댓글