[Section 1] Class, Object, Field, Method

Kim·2022년 9월 3일
0

Boot Camp

목록 보기
11/64
post-thumbnail
post-custom-banner

클래스와 객체는 객체지향 프로그래밍의 가장 기본이다.


Class

클래스란 객체를 정의한 설계도 혹은 틀이라고 할 수 있다. 즉, 클래스는 객체를 생성하는데 사용된다.

클래스는 객체 그 자체아 아닌, 객체를 생성하는데 사용되는 하나의 틀이다.
클래스를 통해 생성된 객체는 인스턴스(instance)라 하고, 클래스로 객체를 만드는 과정을 인스턴스화(instantiate)라고 한다.

비유로 설명을 해보자면 클래스는 설계도, 인스턴스는 집이라 할 수 있다.
설계도를 작성하고, 그 설계도를 통해 집이 만들어진다.

클래스를 잘 정의해두면 매번 객체를 생성할 때마다 고민하지 않아도 된다.

구성요소와 문법

클래스는 기본적으로 class 키워드를 사용하여 정의한다. 클래스명은 주로 대문자로 시작한다.

public class Example {
	int x = 10; //필드
    void printx( ) //메서드
    Example { } //생성자
    class Example { } //이너 클래스
}
  1. 필드 : 클래스의 속성을 나타내는 변수
  2. 메서드 : 클래스의 기능을 나타내는 변수
  3. 생성자 : 클래스의 객체를 생성하는 역할
  4. 이너 클래스 : 클래스 내부의 클래스3

각각의 요소를 자동차에 비유하면 필드는 모델명, 색상, 디자인 등이 포함된다. 메서드는 시동, 가속, 정지 등이 포함될 수 있다.

Object

객체는 클래스에 정의되고 설계된 내용 그대로 생성된다.
객체는 크게 속성과 기능이라는 두 요소로 이루어져 있고, 이너 클래스와 함께 객체의 멤버라고 불린다.


위 사진의 차를 하나의 객체로 생각해보자.
간단하게 말하자면 차가 가지는 일반적인 속성은 모델명과 바퀴의 개수, 문의 개수, 색상 등이 있을 것이다. 기능으로는 시동을 걸고 가속, 감속, 정지 등의 기능을 생각해 볼 수 있다.

이러한 차의 속성과 기능을 코드로 작성해보면 아래와 같다.

class Car {
	private String model; //모델명
    private int wheels; //바퀴의 개수
    private int doors; //문의 개수
    private String color; //색상
    
    void powe() { }; //시동
    void accelerate() { }; //가속
    void stop() { }; //정지
}

Field

필드는 클래스에 포함된 변수를 의미하는 것으로 객체의 속성을 정의할 때 사용한다.
자바에서의 변수는 클래스 변수, 인스턴스 변수, 지역 변수 세 가지로 구분할 수 있다. 이 중에서 필드라고 부르는 것은 클래스 변수와 인스턴스 변수다. 이 둘은 static 키워드의 유무로 구분할 수 있다.

static 키워드가 함께 선언된 것은 클래스, 그렇지 않은 것은 인스턴스 변수다. 이 두 유형에 포함되지 않고 메서드 내에 포함된 모든 변수는 지역 변수라고 한다.

static

static 키워드가 붙어있는 멤버를 정적 멤버라고 부른다. 인스턴스 변수는 static이 붙어있지 않다.

정적 필드는 객체 간의 공유 변수의 성질이 있다. 이는 메서드에도 동일하게 적용된다.
또한, 정적 메서드의 경우 인스턴스 변수&메서드를 사용할 수 없다. 정적 메서드는 인스턴스 생성을 하지 않고도 호출이 가능해 인스턴스가 존재하지 않을 수 있다.

Method

메서드는 특정 작업을 수행하는 일련의 명령문들의 집합이다.
메서드는 크게 메서드 시그니처와 메서드 바디로 구분할 수 있다.

public static int add(int x, int y) { //메서드 시그니처
	int result = x + y; //메서드 바디
}

메서드 시그니처는 반환 타입과 메서드명, 매개 변수에 대한 정보를 포함한다.
위의 코드를 풀어보면 메서드명이 add이며, int타입에 2개의 값을 받아 더하고 int타입을 반환하는 메서드라 정리할 수 있다.

만약 메서드의 반환 타입이 void가 아닌 경우에는 메서드 바디{ } 안에 반드시 return문이 존재해야 한다.
return문은 작업을 수행한 결과값을 호출한 메서드로 전달한다. 여기서 결과값은 반환 타입과 일치하거나 자동 형변환이 가능한 것이어야 한다.

메서드 호출

메서드도 클래스 멤버이므로 클래스 외부에서 메서드를 사용하기 위해서는 인스턴스를 생성해야 한다. 반면에 클래스 내부에 있는 메서드는 따로 객체를 생성하지 않아도 서로를 호출할 수 있다.

메서드명(매개변수1, 매개변수2, ...); // 메서드 호출 (매개 변수가 없을 수도 있음)

메서드 호출 시 괄호 안에 작성하는 입력 값을 인자라고 한다. 인자의 개수와 순서는 메서드를 정의할 때 선언한 매개변수와 일치해야 한다. 그렇지 않을 경우 실행 에러가 발생한다.

메서드 오버로딩

메서드 오버로딩은 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것이다.

먼저 메서드 시그니처에 대해 이해를 해야한다.
간단하게 설명하자면, 메서드 시그니처란 메서드명과 매개변수의 타입을 말한다. 메서드 시그니처는 각 메서드를 구분한다.

public class Overloading {
    public static void main(String[] args) {
        Shape s = new Shape(); //객체 생성

        //메서드 호출
        s.area();
        s.area(5);
        s.area(10, 10);
        s.area(6.0, 12.0);
    }
}
class Shape { //메서드 오버로딩 (하나의 class 안에 같은 이름의 여러 메서드를 정의)
    public void area() {
        System.out.println("넓이");
    }
    public void area(int r) {
        System.out.println("원의 넓이 = " + 3.14 * r * r);
    }
    public void area(int w, int l) {
        System.out.println("직사각형의 넓이 = " + w * l);
    }
    public void area(double b, double h) {
        System.out.println("삼각형의 넓이 = " + 0.5 * b * h);
    }
}

위 코드를 보면 Shape class 내에 모든 메서드가 area라는 이름을 갖고 있는데, 각기 다른 출력값을 리턴한다.

중요한 것은 무조건 같은 메서드명을 사용한다고 해서 오버로딩이 되는 것이 아니다. 오버로딩이 성립되려면 아래와 같은 조건이 성립되어야 한다.

  1. 같은 이름의 메서드명을 써야한다.
  2. 매개변수의 개수나 타입이 다르게 정의되어야 하며, 조건이 하나라도 충족되지 않으면 컴파일 에러가 발생한다.

반환타입은 오버로딩이 성립하는데 영향을 끼치지 않는다.

참고자료

객체
클래스

post-custom-banner

0개의 댓글