영권's
5주차 과제: 클래스 본문
목표
자바의 Class에 대해 학습하세요.
학습할 것 (필수)
- 클래스 정의하는 방법
- 객체 만드는 방법 (new 키워드 이해하기)
- 메소드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
객체란?
객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한것을 말한다.
예를 들어 물리적으로 존재하는 자동차, 자전거, 책, 사람, 강의, 주문 등이 모두 객체가 될 수 있다.
객체는 속성과 동작으로 구성되어 있다. 예를 들어 사람은 이름, 나이, 등의 속성과 웃다, 걷다등의 동작이 있다 자바는 이 속성과 동작들을 각각 필드와 메서드라고 부른다.
객체와 클래스
현실에서 객체는 설계도를 바탕으로 만들어 진다. 예로 자동차를 만들기 위해서는 공장에서 설계도를 보고 자동차를 만들어야한다.
객체 지향 프로그래밍에서도 메모리에서 사용하고 싶은 객체가 있다면 우선 설계도로 해당 객체를 만드는 작업이 필요하다.
자바에서는 설계도에 해당하는 것이 클래스이다.
클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.
클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고한다.
자동차 객체는 자동차 클래스의 인스턴스인 셈이다. 그리고 클래스로부터 객체를 만드는 과정을 인스턴스화라고 한다. 하나의 클래스로부터 여러 개의 인스턴스를 만들 수 있는데 이것은 동일한 설계도로부터 여러 대의 자동차를 만드는 것과 동일하다.
-
클래스 정의하는 방법
사용하고자 하는 객체를 구상했다면 그 객체의 대표 이름을 하나 결정하고 이것을 클래스 이름으로 한다.
예를 들어 사람 객체의 클래스는 Person, 자동차 객체의 클래스는 Car라는 이름으로 줄 수 있다.
클래스 이름은 다른 클래스와 식별할 목적으로 사용되므로 자바의 식별자 작성 규칙에 따라서 만들어야 한다.
작성 규칙
1. 하나 이상의 문자로 이루어져야 한다.
2. 첫번째 글자는 숫자가 올 수 없다.
3. $,_ 외의 특수 문자는 사용할 수 없다.
4. 자바 키워드는 사용할 수 없다.
여기서 public class 키워드는 클래스를 선언할 때 사용하며 소문자로 작성한다.
클래스 이름 뒤에는 반드시 중괄호{}를 붙여 주는데 이것은 클래스 선언의 시작과 끝을 알려준다.
.java 파일의 이름과 public class 의 클래스 이름은 같아야한다.
일반적으로 소스 파일 하나당 하나의 클래스를 선언한다. 하지만 두 개 이상의 클래스 선언도 가능하다.
클래스 이름은 한글이든 영어든 상관없지만, 한글로 클래스 이름을 만드는 경우는 거의 없다.
자바 언어는 영어 대소문자를 다른 문자로 취급하기 때문에 클래스 이름도 영어 대소문자를 구분한다.
관례적으로 클래스 이름이 단일 단어라면 첫 자를 대문자로 하고 나머지는 소문자로 작성한다. 만약 서로 다른 단어가 혼합된 이름을 사용한다면 각 단어의 첫 머리 글자는 대문자로 작성하는 것이 관례이다.
말 그대로 관례이며 각 조직마다 코딩 컨벤션이 다를 수 있기 때문에 해당 조직의 코딩컨벤션에 따라 작성하면 된다.
참고) 오라클의 코딩컨벤션
www.oracle.com/java/technologies/javase/codeconventions-introduction.html
클래스의 구조
-
필드(field) - 필드는 해당 클래스 객체의 상태 속성을 나타내며, 멤버 변수라고도 불린다. 여기서 초기화하는 것을 필드 초기화 또는 명시적 초기화라고 한다.
- 인스턴스 변수 - 이름에서 알 수 있듯이 인스턴스가 갖는 변수이다. 그렇기에 인스턴스를 생성할 때 만들어진다. 서로 독립적인 값을 갖으므로 heap 영역에 할당되고 gc에 의해 관리된다.
- 클래스 변수 - 정적을 의미하는 static키워드가 인스턴스 변수 앞에 붙으면 클래스 변수이다. 해당 클래스에서 파생된 모든 인스턴스는 이 변수를 공유한다. 그렇기 때문에 heap 영역이 아닌 static 영역에 할당되고 gc의 관리를 받지 않는다. 또한 public 키워드까지 앞에 붙이면 전역 변수라 볼 수 있다.
-
메서드(method) - 메서드는 해당 객체의 행동을 나타내며, 보통 필드의 값을 조정하는데 쓰인다.
- 인스턴스 메서드 - 인스턴스 변수와 연관된 작업을 하는 메서드이다. 인스턴스를 통해 호출할 수 있으므로 반드시 먼저 인스턴스를 생성해야 한다.
- 클래스 메서드 - 정적 메서드라고도 한다. 일반적으로 인스턴스와 관계없는 메서드를 클래스 메서드로 정의한다.
- 생성자(constructor) - 생성자는 객체가 생성된 직후에 클래스의 객체를 초기화하는 데 사용되는 코드 블록이다. 메서드와 달리 리턴 타입이 없으며, 클래스엔 최소 한 개 이상의 생성자가 존재한다.
-
초기화 블록(initializer) - 초기화 블록 내에서는 조건문, 반복문 등을 사용해 명시적 초기화에선 불가능한 초기화를 수행할 수 있다.
- 클래스 초기화 블록 - 클래스 변수 초기화에 쓰인다.
-
인스턴스 초기화 블록 - 인스턴스 변수 초기화에 쓰인다.
클래스 변수 초기화: 기본값 → 명시적 초기화 → 클래스 초기화 블록
인스턴스 변수 초기화: 기본값 → 명시적 초기화 → 인스턴스 초기화 블록 → 생성자
static이나 public같은 키워드를 제어자(modifier)라고 하며, 클래스나 멤버 선언 시 부가적인 의미를 부여한다.
-
접근 제어자 - 접근 제어자는 해당 클래스 또는 멤버를 정해진 범위에서만 접근할 수 있도록 통제하는 역할을 한다. 클래스는 public과 default밖에 쓸 수 없다. 범위는 다음과 같다. 참고로 default는 아무것도 덧붙이지 않았을 때를 의미한다.
- static - 변수, 메서드는 객체가 아닌 클래스에 속한다.
-
final
- 클래스 앞에 붙으면 해당 클래스는 상속될 수 없다.
- 변수 또는 메서드 앞에 붙으면 수정되거나 오버라이딩 될 수 없다.
-
abstract
- 클래스 앞에 붙으면 추상 클래스가 되어 객체 생성이 불가하고, 접근을 위해선 상속받아야 한다.
- 변수 앞에 지정할 수 없다. 메서드 앞에 붙는 경우는 오직 추상 클래스 내에서의 메서드밖에 없으며 해당 메서드는 선언부만 존재하고 구현부는 상속한 클래스 내 메서드에 의해 구현되어야 한다. 상속과 관련된 내용은 6주차에 다룰 예정이다.
- transient - 변수 또는 메서드가 포함된 객체를 직렬화할 때 해당 내용은 무시된다.
- synchronized - 메서드는 한 번에 하나의 쓰레드에 의해서만 접근 가능하다.
- volatile - 해당 변수의 조작에 CPU 캐시가 쓰이지 않고 항상 메인 메모리로부터 읽힌다.
-
객체 만드는 방법 (new 키워드 이해하기)
클래스를 생성했다면 설계도가 만들어진 셈이다.
클래스로부터 객체를 생성하는 방법은 다음과 같이 new 연사자를 사용하면 된다.
new는 클래스로부터 객체를 생성시키는 연산자이다.
new 뒤에는 생성자가 오는데 생성자는 클래스() 형태를 가지고 있다. new 연산자로 생성된 객체는 메모리 힙(heap)영역에 생성된다.
현실 세계에서 물건의 위치를 모르면 물건을 사용할 수 없듯이, 객체지향 프로그램에서도 메모리 내에서 생성된 객체의 위치를 모르면 객체를 사용할 수 없다.
그래서 new 연산자는 힙영역에 객체를 생성시킨 후, 객체의 주소를 리턴하도록 되어있다. 이 주소를 참조 타입인 클래스 변수에 저장해 두면, 변수를 통해 객체를 사용할 수 있다.
new 연산자로 객체를 생성하고 리턴된 객체의 주소를 변수에 저장하면 다음 그림과 같이 변수가 객체를 참조하게 된다.
-
메소드 정의하는 방법
- 접근 제어자 및 기타 제어자 -
- 해당 메서드에 접근할 수 있는 범위를 명시하거나 위에서 언급했듯이 부가적인 의미를 부여한다.
- 반환 타입
- 반환 타입은 메소드가 실행된 후 반환되는 값의 타입을 말한다. 메서드는 반환값이 있을 수도 있고 없을 수도 있다.
- 메서드 이름
- 메서드 이름은 자바 식별자 규칙에 맞게 작성하면 된느데, 다음 사항에 주의하면 된다.
- 숫자로 시작하면 안되고, $ 와 _ 를 제외한 특수 문자를 사용하지 말아야 한다.
- 관례적으로 메소드명으로 소문자로 작성한다.
- 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫머리 글자는 대문자로 작성한다.
- 메서드가 수행하는 역할이 무엇인지 명확히 나타낼 수 있는 이름이면 좋다.
- 메서드 이름은 자바 식별자 규칙에 맞게 작성하면 된느데, 다음 사항에 주의하면 된다.
- 매개변수 리스트
- 매개변수는 메서드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용된다.
- 매개변수도 필요한 경우가 있고 필요 없는 경우가 있다.
- 메서드 시그니처 - 컴파일러는 메서드 시그니처를 보고 오버로딩(overloading)을 구별한다. 물론 리스트의 순서도 동일해야 한다.
-
생성자 정의하는 방법
생성자는 new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
객체 초기화란 필드를 초기화 하거나 메서드를 호출해서 객체를 사용할 준비를 하는것을 말한다.
생성자를 실행시키지 않고 클래스로부터 객체를 만들 수 없다.
new 연산자에 의해 생성자가 성공적으로 실행되면 힙영역에 객체가 생성되고 객체의 주소가 리턴된다.
리턴된 객체의 주소는 클래스 타입 변수에 저장되어 객체에 접근할 때 이용된다.
만약 생성자가 성공적으로 실행되지 않고 예외가 발생했다면 객체는 생성되지 않는다.
생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 생성한다. 하지만 기본 생성자가 아닌 다른 형태의 생성자만 명시했다면 기본 생성자는 컴파일시에 생성되지 않는다.
-
this 키워드 이해하기
인스턴스 멤버란 객체를 생성 후 사용할 수 있는 필드와 메서드를 말하는데, 이들을 각각 인스턴스 필드와 인스턴스 메서드라고 부른다.
인스턴스 필드와 메서드는 객체에 소속된 멤버이기 때문에 객체없이는 사용할 수 없다.
public class Car{
// 필드
int gas;
// 메서드
void setSpeed(int speed){}
}
만약 Car 클래스에 gas 필드와 setSpeed 메서드가 다음과 같이 선언 되어 있다고 가정해보자.
gas 필드와 setSpeed() 메서드는 인스턴스 멤버이기 떄문에 외부 클래스에서 사용하기 위해서는 우선 Car 객체(인스턴스)를 생성하고 참조 변수로 접근해야 한다.
객체 외부에서 인스턴스 멤버에 접근하기 위해 참조 변수를 사용하는 것과 마찬가지로 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this를 사용할 수 있다.
우리가 자신을 "나" 라고 하듯이, 객체는 자신을 "this"라고 한다.
따라서 this.model 은 자신이 가지고 있는 model 필드라는 뜻이다.
this는 주로 생성자와 메서드의 매개 변수 이름이 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시하고자 할 때 사용한다.
참고)
도서 : 이것이 자바다.
jeeneee.dev/java-live-study/week5-class/
'스터디 > 백기선 라이브 스터디(자바)' 카테고리의 다른 글
7주차 과제: 패키지 (0) | 2021.02.19 |
---|---|
6주차 과제: 상속 (0) | 2021.02.17 |
3주차 과제: 연산자 (0) | 2021.01.18 |
4주차 : 제어문 (0) | 2020.12.12 |
2주차 과제: 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.21 |