github.com/whiteship/live-study/issues/5
- 클래스 정의하는 방법
- 객체 만드는 방법 (new 키워드 이해하기)
- 메소드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
5주차가 되었다.
이제 자바에서 중요한 클래스를 알아보자
그전에 알고 넘어가야 할 개념이 존재한다
바로 객체(Object) 다. 객체란?
"객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것"
- 이것이 자바다
흔히 자바를 처음 배우기 시작하면 많이 붕어빵이야기를 듣는다.
붕어빵틀(Class)을 만들어서 사람이 다양한 붕어빵(Object)을 찍어낸다.
심플하면서 잘 표현한 이야기다
이런 객체를 이용해서 개발하는 걸 객체 지향 프로그래밍이라고 한다
자동차를 생각해보자. 완성품이 뚝! 하고 나타나지 않는다. 자동차를 구성하는 부품들을 만들고 하나씩 조립하다보면 우리가 흔히 알고 있는 자동차로 탄생하는 것이다.
"객체 지향 프로그래밍(OOP : Object Oriented Programming) 은 만들고자 하는 완성품인 객체를 모델링하고, 집합 관계에 있는 부품 객체와 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발하는 기법이다."
- 이것이 자바다
생소한 단어지만 어려운건 아니다.
이제 클래스에 대해 배워보자
클래스
현실에서도 자동차, 건물을 만들 때 설계도를 바탕으로 만든다. 객체 지향 프로그래밍에서도 그렇다. 무엇을 만들고 싶으면 설계도가 필요하다. 이 설계도를 클래스(class) 라고 한다.
1) 클래스 선언
클래스 이름은 다른 클래스와 식별할 수 있어야해서 다음과 같은 자바 식별자 규칙에 따라서 만들어야한다
작성 규칙 | 예 |
하나 이상의 문자로 이루어져야 한다. | Car, Sportsar |
첫 번째 글자에는 숫자가 올 수 없다. | Car (O), 3Car (X) |
'$', '_' 외의 특수 문자는 사용할 수 없다. | $Car (O), _Car (O), @Car (X), #Car (X) |
자바 키워드는 사용할 수 없다. | int (X), for (X) |
자바는 유니코드를 지원해서 한글로 클래스명을 작성할 수 있다. 하지만 대부분 영어로만 작성하는걸 염두해두자.
한글로 작성안하는 이유는 말이 많지만 개발 자체가 한글 기반으로 구성된게 아니라 언제어디서 예외상황이 발생할 지 모르니 최소하자는게 많은 주장인거 같다.
자바 파일명과 클래스명은 동일해야한다 다르면 에러가 발생한다.
클래스명은 자바 메소드명과 다르게 첫글자를 대문자로 표현한다. 여러 단어가 혼합되면 camelcase 를 따른다.
일반적으로 자바 파일하나에 클래스 하나를 선언하지만 여러개를 선언할 수 있다.
2) 클래스의 구성 멤버
클래스에는 객체가 가져야할 구성 멤버가 존재한다
(1) 필드 (Field)
- 객체의 데이터가 저장되는 곳, 변수라 부르지는 않는다. 변수는 생성자와 메서드내에서만 사용되고 생성자와 메서드가 종료되면 같이 사라지기 때문이다. 필드는 객체가 생성되고 소멸될 때까지 객체와 함께한다.
(2) 메서드 (Method)
- 객체의 동작에 해당되는 실행하는 중괄호 {} 블록이다. 메소드는 필드를 읽고 수정하는 역할과 다른 객체를 생성해서 다양한 기능을 수행한다.
(3) 생성자 (Constructor)
- 객체 생성 시 초기화 담당하며 객체를 new 연산자로 호출이 되는 특별한 중괄호 {} 블록이다. 생성자의 역할은 객체 생성 시 초기화를 담당하다. 필드를 초기화하거나 메서드를 호출한다. 메서드와 비슷하지만 클래스명과 동일하고 리턴 타입이 없다. 클래스에 생성자가 없어도 자바에서는 default 로 선언해주기에 new 클래스명() 을 사용할 수 있다.
객체 만드는 방법 (new 키워드 이해하기)
객체를 만드는 방법은 간단하다.
new 연산자를 사용하면 된다.
new 연산자는 클래스로부터 객체를 생성시켜준다. new 연산자 뒤에는 생성자가 온다.
new 연산자로 생성된 객체는 메모리 힙(heap) 영역에 생성되고 객체의 주소를 리턴한다.
객체를 생성할 때에는 변수에 저장해주는 걸 잊지말자. 변수에 저장을 안하면 참조하는 게 없어서 GC 에 의해 삭제된다. 사용하려고 생성했으니 꼭 변수에 할당하자.
메서드 정의하는 방법
메서드 선언은 리턴타입, 메소드명, 매개변수선언과 실행 블록 {} 으로 구성된다.
//리턴타입, 메서드명, 매개변수선언(메서드 실행 시 데이터받음)
String methodName (String name){
// 실행할 코드 작성영역
}
메서드명도 위의 클래스명처럼 작성규칙이 거의 똑같다.
다만 클래스명처럼 첫글자가 대문자가 아닌 소문자인것만 기억하면 된다.
메서드를 선언할 때 매개변수를 사용해도 되고 없어도 된다. 사용되면 여러개를 선언할 수 있기도 하다.
void testMethod01(){}
void testMethod02(String name) {}
void testMethod03(String name, String name02, String name03) {}
리턴타입은 메서드를 실행 후 받을 값의 타입이다. 리턴 타입이 있을 경우 반드시 해당 타입대로 리턴을 해줘야한다.
리턴이 없을 수도 있다. 그럴 경우 void 로 사용한다.
String testMethod01() {
// 리턴 타입이 String 이면 String 타입의 값을 리턴해줘야한다.
return "리턴";
}
int testMethod02() {
// 리턴 타입이 int 이면 int 타입의 값을 리턴해줘야한다.
return 11;
}
void testMethod03() {
// 리턴 타입이 없으면 리턴하는거 없이 메서드가 종료된다.
}
생성자 정의하는 방법
위에서 언급한것처럼 자바에서는 생성자를 선언안해도 default 로 선언해줘서 사용이 가능하다고 했다.
하지만 명시적으로 선언해서 사용해야할 경우엔 다음과 같은 방식으로 사용하면 된다
클래스(매개변수선언, ...) {
// 객체 초기화 코드 및 메서드 호출
}
메서드와 동일하나 차이점은 리턴을 할 수 없다는 것이다. 오로지 초기화만 가능하다.
public class Car() {
String carName;
String carModel;
String carColor;
int maxSpeed;
public Car(String carName
, String carModel
, String carColor
, int maxSpeed) {
this.carName = carName;
this.carModel = carModel;
this.carColor = carColor;
this.maxSpeed = maxSpeed;
}
}
만약에 명시적으로 생성자를 선언했으면 인스턴스를 생성할 때 반드시 해당 생성자를 사용해야한다.
// Car car01 = new Car(); // 에러 발생.
Car car02 = new Car("초보차", "검정", "쿠페", 200);
위의 Car 에선 명시 생성자로 매개변수 4개를 선언하고나서 객체를 생성하려니 new Car() 에서는 에러가 발생한다.
명시적으로 선언된 생성자를 사용해야하니 매개변수 4개를 달라는 것이다.
만약에 매개변수를 받을 수도 있고 안 받을 수도 있다면? 같은 이름의 생성자를 여러번 선언해서 사용하면 된다.
이를 생성자의 오버로딩이라고 한다.
public class Car() {
String carName;
String carModel;
String carColor;
int maxSpeed;
// 아무것도 안하는 기본적인 생성자
public Car() {
}
// carName만 매개변수로 받는 명시 생성자
public Car(String carName) {
this.carName = carName;
}
// Car 의 필드 4개를 모두 받는 명시 생성자
public Car(String carName
, String carModel
, String carColor
, int maxSpeed) {
this.carName = carName;
this.carModel = carModel;
this.carColor = carColor;
this.maxSpeed = maxSpeed;
}
}
this 키워드 이해하기
남에게 본인을 뭐라고 말할까? 보통 '나'라고 부를 것이다
생성된 객체에서도 본인을 뜻하는 용어가 'this' 이다.
위의 예제를 보면 this 가 많이 보인다.
this.필드명 혹은 this.메서드명으로 객체의 필드나 메서드에 접근할 수 있다.
또한 생성자에서는 this() 를 사용할 수 있는데
이는 또 다른 명시적 생성자에 접근하는 방식이다
public class Car() {
String carName;
String carModel;
String carColor;
int maxSpeed;
// 기본 생성자
public Car() {
this("자가용"); // 매개변수 1개인 생성자를 호출
}
// 매개변수 1개인 생성자
public Car(String carName) {
this(carName, "쿠페", "파랑", 200); // 매개변수 4개인 생성자를 호출
}
// Car 의 필드 4개를 모두 받는 명시 생성자
public Car(String carName
, String carModel
, String carColor
, int maxSpeed) {
this.carName = carName;
this.carModel = carModel;
this.carColor = carColor;
this.maxSpeed = maxSpeed;
}
}
위처럼 되어있다면? new Car() 를 하는것만으로 명시적 생성자들이 차례차례 실행이 되며
마지막엔 carName 은 자가용, carModel 은 쿠폐, carColor 는 파랑, maxSpeed 는 200 을 가지는 객체가 생성될 것이다.
'개발 & 방법론 > Java' 카테고리의 다른 글
7주차 : 패키지 (0) | 2021.01.01 |
---|---|
6주차 : 상속 (0) | 2020.12.30 |
4주차 : 제어문 (0) | 2020.12.12 |
3주차 과제 : 연산자 (0) | 2020.11.27 |
2주차 과제: 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.19 |