목표
자바의 Class에 대해 학습하세요.
학습할 것 (필수)
- 클래스 정의하는 방법
- 객체 만드는 방법 (new 키워드 이해하기)
- 메소드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
#클래스 정의하는 방법
클래스의 선언
클래스(class)란 객체 지향 프로그래밍의 추상화(abstraction)라는 개념을 직접 구현한 것이라 할 수 있다.
자바에서는 개발자의 편의를 위해 유용하게 사용할 수 있는 많은 수의 클래스를 미리 정의하여 제공하고 있다
또한, 개발자가 원하는 동작을 하는 새로운 클래스를 손쉽게 작성할 수도 있다.
자바에서 클래스를 선언하는 방법은 접근 제어자와 함께 class키워드를 사용하면 된다.
정의
접근제어자 class 클래스이름{
접근제어자 필드1의타입 필드1의이름;
접근제어자 필드1의타입 필드2의이름;
...
생성자
접근제어자 메서드1의 원형
접근제어자 메서드2의 원형
...
}

#객체 만드는 방법 (new 키워드 이해하기)
클래스란 '객채를 정의해 놓은 것.' 또는 클래스는 '객체의 설계도 또는 틀' 이라고 정의할 수 있다.
클래스는 객체를 생성하는 데 사용되며, 객체는 클래스에 정의된 대로 생성된다.
객체란?
객체의 사전적 정의는 '실제로 존재하는 것'이다. 우리가 주변에서 볼 수 있는 책상, 의자, 자동차와 같은
사물들이 곧 객체이다. 객체지향 이론에서는 사물과 같은 유형적인 것뿐만 아니라
개념이나 논리와 같은 무형적인 것들도 객체로 간주한다.
프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
객체를 사용한다는 것은 객체가 가지고 있는 속성(변수)과 기능(메서드)을 사용한다는 뜻이다.
객체 생성 방법
클래스 이름 변수명 = new 클래스 이름();
new 연산자란?

new는 클래스 타입의 인스턴스(객체)를 생성해주는 역할을 담당 new 연산자를 통해 메모리(Heap 영역)에 데이터를 저장할 공간을 할당받고 그 공간의 참조값(reference value / 해시 코드)을 객체에게 반환하여 주고 이어서 생성자를 호출하게 된다. 인스턴스를 핸들 하기 위해서는 new 연산자를 통해 참조값을 저장한 객체로만 접근이 가능하다.
객체 생성 과정
ex) Student s = new Student();
1. new 연산자가 변수명 객체에 저장될 메모리 공간 할당(heap에 저장)
2. 생성자가 s객체를 초기화
3. new 연산자가 새로 생성된 객체의 주소(reference) s 변수에 저장
4. s를 통해 Student에 접근 가능
#메소드 정의하는 방법
메서드(method)란?
특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
수학의 함수와 유사하며, 어떤 값을 입력하면 이 값으로 작업을 수행해서 결과를 반환
수학의 함수와 달리 메서드는 입력값 또는 출력값(결과값)이 없을 수도 있으며,
심지어는 입력값과 출력값이 모두 없을 수도 있다.

메서드의 선언부
반환타입, 메서드이름, 매개변수 선언으로 구성
메서드가 작업을 수행하기 위해 어떤 값들을 필요로 하고
작업의 결과로 어떤 타입을 반환하는지에 대한 정보 제공
메서드의 선언부는 후에 변경사항이 발생하지 않도록 신중히 작성해야 한다
메서드의 선언부를 변경하게 되면, 그 메서드가 호출되는 모든 곳이 함께 변경되어야 하기 때문
매개변수 선언(parameter declaration)
매개변수는 메서드가 작업을 수행하는데 필요한 값들(입력)을 제공받기 위한 것
필요한 값의 개수만큼 변수를 선언하며 각 변수 간의 구분은 쉼표', '를 사용한다.
주의할 점은 일반적인 변수 선언과 ㄷ라리 두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다는 것이다.
매개변수 있을 경우 if문으로 유효성 검사를 해줘야 한다.
반환 타입(return type)
메서드의 작업 수행 결과(출력)인 '반환값(return value)'의 타입을 적는다.
단, 반환값이 없는 경우 반환 타입으로 'void'를 적어야 한다.
메서드의 구현부
메서드의 선언부 다음에 오는 괄호 { }를 '메서드의 구현부라고 한다.
여기에 메서드를 호출했을 때 수행될 문장들을 넣는다.
return문
메서드 내에서 동작하고 얻은 결과(필요한 데이터)를 반환해주는 역할을 한다.
메서드의 반환 타입이 'void'가 아닌 경우 구현부{ }안에 'return 반환값;'이 반드시 포함되어 있어야 한다.
이 문장은 작업을 수행한 결과인 반환값을 호출한 메서드로 전달하는데,
이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다.
여러개의 변수를 선언할 수 있는 매개변수와 달리 return문은 단 하나의 값만 반환할 수 있는데,
메서드로의 입력(매개변수)은 여러 개일 수 있어도 출력(반환값)은 최대 하나만 허용하는 것이다
returm문 뒤에는 어떠한 구문도 올 수 없다.(컴파일 에러 발생) 다르게 말하면
return 문을 사용하면 값을 반환해 주고 해당 메서드는 실행이 종료된다\
지역변수(local variable) : 메서드 내에 선언된 변수
메서드 내에 선언된 변수들은 그 메서드 내에서만 사용할 수 있으므로 서로 다른 메서드라면
같은 이름의 변수를 선언해도 된다.
#생성자 정의하는 방법
생성자란?
인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'
인스턴스 변수 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 하는 작업을 위해서도 사용
인스턴스 초기화란, 인스턴스 변수들을 초기화하는 것을 뜻한다
생성자 역시 메서드처럼 클래스 내에 선언되며, 구조도 메서드와 유사하지만 리턴 값이 없다는 점이 다르다.
그렇다고 해서 생성자 앞에 리턴 값이 없음을 뜻하는 키워드 void를 사용하지는 않고 아무것도 적지 않는다
생성자의 조건
-생성자의 이름은 클래스와 같아야 한다
-생성자는 리턴 값이 없다.
생성자의 정의
생성자도 오버 로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
클래스이름(타입 변수명, 타입 변수명, ....)_
//인스턴스 생성 시 수행될 코드,
//주로 인스턴스 변수의 초기화 코드를 적는다.
}
class Point{
Point(){ //매개변수가 없는 생성자
...
}
Point(int x, int y){ //매개변수가 있는 생성자
...
}
}
연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
기본 생성자
모든 클래스는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있다
우리가 클래스 내부에 생성자 선언을 생략했다면 컴파일러는 기본 생성자(default constructor)를 바이트 코드에 자동 추가시킨다.
컴파일러가 자동적으로 추가해주는 기본 생성자는 매개 변수도 없고 아무런 내용도 없는 아주 간단한 것이다.( ex) Point(){ })
주의할 점은 컴파일러가 자동적으로 기본 생성자를 추가해주는 경우는 클래스에 정의된 생성자가 하나도 없을 때뿐이다.
생성자가 하나라도 있다면 컴파일러는 기본 생성자를 추가하지 않는다.
매개변수가 있는 생성자
생성자는 메서드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일해야 한다.
생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아 인스턴스의 초기화에 사용할 수 있다.
인스턴스마다 각기 다른 값으로 초기화되어야 하는 경우가 많기 때문에 매개 변수를 사용한 초기화는 매우 유용하다.
class Car{
String color;
String gearType;
int door;
Car(){}
Car(String s, String g, intd){
color = c;
gearType = g;
door = d;
}
}
Car인스턴스를 생성할 때, 생성자 Car()를 사용한다면, 인스턴스를 생성한 다음에 인스턴스 변수들을 따로 초기화해주어야 하지만, 매개변수가 있는 생성자 Car(String color, String gearType, int door)를 사용한다면 인스턴스를 생성하는 동시에 원하는 값으로 초기화할 수 있다.
인스턴스를 생성한 다음에 인스턴스 변수의 값을 변경하는 것보다 매개변수를 갖는 생성자를 사용하는 것이 코드를 보다 간결하고 직관적으로 만든다.
@인스턴스를 생성할 때 결정할 2가지 사항
1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?
#this 키워드 이해하기
자바에서 this와 this()는 전혀 다른 키워드다
this는 인스턴스 자신을 가르치는 참조 변수이고 this()는 생성자를 뜻한다.
this
class Car{
String color;
String gearType;
int door;
Car(){}
Car(String s, String g, intd){
this.color = c;
this.gearType = g;
this.door = d;
}
}
this는 위 코드처럼 생성자의 매개변수로 선언된 이름이 인스턴스인 변수와 같을 때 인스턴스 변수와 지역변수를 구분하기 위해서 사용한다.
Car() 생성자 안에서의 this.color는 인스턴스 변수이고 color는 매개변수로 정의된 지역변수이다.
static메서드에서는 this를 사용하지 못한다
this()
class Car{
String color; // 인스턴스 변수
String gearType;
int door;
Car(){
this("white", "auto", 4); // Car(String color, string gearType, int door)를 호출
}
Car(String color){
this(color, "auto", 4);
}
Car(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
this()는 같은 클래스의 다른 생성자를 호출할 때 사용한다. 위 코드의 Car()생성자와 Car(String color) 생성자는 this()를 통해
모두 Car(String color, String gearType, int door) 생성자를 호출하고 있는 것이다.
'Back-end > Java_T.I.L' 카테고리의 다른 글
| 7.패키지, import, 클래스패스(classpath) (0) | 2022.01.05 |
|---|---|
| 6. 상속, 오버라이딩, 추상클래스, Object 클래스 (0) | 2022.01.03 |
| 4. 제어문_반복문(for, while, do-while) (0) | 2021.12.31 |
| 4. 제어문_선택문(if, else-if, switch) (0) | 2021.12.31 |
| 3. 연산자 (0) | 2021.12.30 |
댓글