[Java] 자바 기초(5)

minide·3일 전
0
post-thumbnail

[Java] 자바 기초(5)

1. 클래스

1-1. 클래스란

클래스란 객체를 정의해놓은 것 또는 **객체의 설계도, 틀**이라고 정의할 수 있다.
클래스는 객체를 생성하는 데 사용되며, 객체는 클래스에 정의된 대로 생성된다.

클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성된다.
필드란 클래스에 포함된 변수(variable)를 의미하며, 메소드란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.

클래스 작성 규칙

  1. 하나 이상의 문자로 이루어져야 한다.
  2. 첫 번째 글자에는 숫자가 올 수 없다.
  3. $, ,, _ 외에는 특수문자를 사용할 수 없다.
  4. 자바 명령어, 키워드는 사용할 수 없다. (while, for, int 등 사용불가)
  5. 이름은 대소문자를 구분한다. (보통 첫번째 글자는 대문자로 작성)

1-2. 클래스 정의하는 방법

클래스를 정의하기 위해서는 우선 **"클래스명.java"**로 소스 파일을 생성해야 한다.

소스 파일 생성 후 아래처럼 클래스를 선언할 수 있다.

public class 클래스명 {
	// 내용
}

이때 파일 이름과 동일한 이름의 클래스에만 public 접근 지정자를 붙일 수 있다.
하나의 소스 파일에 2개 이상의 클래스가 있을 경우 컴파일 시 바이트 코드 파일(.class)은 선언한 클래스의 개수만큼 생긴다. 가급적이면 소스 파일 하나당 하나의 클래스를 선언하는 것이 좋다.

2. 객체

2-1. 객체란

객체란 사전적인 정의로 실제 존재하는 것이다.
객체지향 이론에서는 사물과 같은 유형적인 것뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주한다. 프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.

클래스로부터 객체를 만드는 과정을 **클래스의 인스턴스화(instantiate)**라고 하며, 어떤 클래스로부터 만들어진 객체를 그 **클래스의 인스턴스(instance)**라고 한다.
인스턴스는 객체와 같은 의미지만 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하며, 보다 구체적인 의미를 갖고 있다.

2-2. 객체 만드는 방법

객체를 생성하기 위해서는 **new 키워드**를 사용한다. new는 클래스로부터 객체를 생성시키는 연산자이다.

new 연산자로 생성된 객체는 메모리 힙(heap) 영역에 생성된다.
new 연산자는 객체를 생성시킨 후, 객체의 주소를 리턴하도록 되어 있다.
이 주소를 참조 타입인 클래스 변수에 저장해 두면, 변수를 통해 객체를 사용할 수 있다.

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

클래스의 객체를 참조하기 위한 참조 변수를 선언한 후 클래스의 객체를 생성해 객체의 주소를 참조 변수에 저장한다.

인스턴스는 참조 변수를 통해 다룰 수 있으며, 참조 변수의 타입은 인스턴스의 타입과 일치해야 한다.

클래스는 객체를 생성하는 데 사용될 뿐, 객체 그 자체는 아니다.
클래스는 한 번만 잘 만들어 놓으면 매번 객체를 생성할 때마다 어떻게 객체를 만들어야 할 지를 고민하지 않아도 된다. 그냥 클래스로부터 객체를 생성해서 사용하기만 하면 되기 때문이다.

3. 메소드

3-1. 메소드란

자바에서 클래스는 멤버(member)로 속성을 표현하는 필드(field)와 기능을 표현하는 메소드(method)를 가진다.
그 중에서 메소드란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.

3-2. 메소드 정의하는 방법

접근지정자 반환타입 메소드이름(매개변수목록) {
	// 내용
}

자바에서는 하나의 클래스에 같은 이름의 메소드를 둘 이상 정의할 수 없다. 하지만 메소드 오버로딩(overloading)을 이용하면, 같은 이름의 메소드를 중복하여 정의할 수 있다.

메소드 오버로딩이란 매개변수의 개수나 타입을 다르게 하여 같은 이름의 또 다른 메소드를 작성하는 것이다.

이러한 메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있다. 또한, 메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경을 쓰지 않고 호출할 수 있게 된다.

4. 생성자

4-1. 생성자란

생성자는 new 연산자를 통해 인스턴스화되어 객체를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드라고 생각할 수 있다. (메소드와 비슷하지만 그 의미가 같은 것은 아니다.)

생성자는 멤버 변수를 초기화하는 역할을 한다.
생성자를 선언하지 않으면 컴파일러에서 자동으로 기본 생성자(Default Constructor)를 생성해준다.

생성자는 다음과 같은 특징을 가진다.

  1. 생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않는다.
  2. 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있다.
  3. 객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있다.

4-2. 생성자 정의하는 방법

객체를 선언할 때 보통 아래와 같이 선언한다.

클래스명 객체명 = new 클래스명();

여기서 클래스명() 부분이 생성자다. 즉, 우리는 객체를 만들면서 무의식적으로 생성자를 사용하고 있었던 것이다.

이때 클래스명 뒤의 소괄호에는 아무것도 적지 않는 게 대부분이지만, 이 안에 어떤 값을 넣어줄 수 있다.

생성자에 값을 넣는 것은 클래스의 객체를 만들 때 내가 입력해준 값을 갖는 객체를 만든다는 뜻이다.


객체 선언과 생성자에 대해 정리하면 아래와 같다.

5. this 키워드

5-1. this 키워드란

this 키워드란 현재 객체(자기 자신)을 참조하는 키워드이다.
아래 this 키워드 사용 방법을 통해 이 말이 무슨 의미인지 이해해보자.

5-2. this 키워드 사용하는 방법

public class Car {
	String name;
    
    public Car(String n) {
    	name = n;
    }
}

위와 같이 Car라는 클래스가 있다고 하자. Car 클래스는 String 변수와 String 변수를 받는 생성자를 갖고 있다.

그런데 매개변수 명이 n이라 이 변수가 무엇을 의미하는지 감이 안온다. 따라서 n이라는 매개변수를 name으로 바꿨다.

public class Car {
	String name;
    
    public Car(String name) {
    	name = name;
    }
}

그런데 이렇게 쓰면 name이라는 변수명이 두 번 나오기 때문에 뭐가 다른지 정확히 알 수 없다.
이를 구분하기 위해 사용되는 것이 this이다.

public class Car {
	String name;
    
    public Car(String name) {
    	this.name = name;
    }
}

이렇게 적으면 왼쪽의 this.name은 클래스의 name 변수이고, 오른쪽의 name은 매개변수라는 것을 알 수 있다.

profile
아무것도 몰라요

0개의 댓글