클래스란 ?
객체(Object)라는 상태와 행동을 가지는 주체를 만드는 틀 또는 설계도의 의미로 사용된다.
클래스는 필드(field) 생성자(constructor) 메소드(method)로 구성되어있다.
이 요소들은 생략되거나 복수 개가 작성될 수 있다.
public Class ClassName {
// 필드 (field)
int fieldName;
// 생성자 (constructor)
ClassName() { ... }
// 메소드 (method)
void methodName() { ... }
}
- Field
필드는 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳
선언 형태는 변수(Variable)와 비슷하지만 필드는 변수라고 부르지 않는데
그 이유는 변수는 생성자와 메소드내에서만 사용되고 생성자와 메소드가 실행 종료하면 자동 소멸 한다.
그러나 필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸하지 않는 한 객체와 함께 존재한다.
- Constructor
생성자는 new 연산자로 호출되는 특별한 중괄호 { } 블록이다.
생성자의 역할은 객체 생성 시 초기화를 담당한다.
필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 한다.
생성자를 실행시키지 않고는 클래스로부터 객체를 만들 수 없다.
(변수에 초기화 하지 않고 사용할 수 없는 것과 같은 맥락)
new 연산자로 생성자가 성공적으로 실행되면 힙(heap) 영역에 객체가 생성되고 객체의 주소가 리턴된다.
리턴된 객체의 주소는 클래스 타입 변수에 저장되어 객체에 접근할 때 이용된다.
만약 생성자의 실행에 문제가 있다면 객체는 생성되지 않는다.
생성자는 메소드이며 모든 생성자는 리턴 타입이 없기에 void를 생략한 것
- 기본 생성자 (Default Constructor)
모든 클래스는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있다.
생성자의 선언을 생략해도 컴파일러는 기본 생성자(Default Constructor)를 바이트 코드에 자동 추가시킨다.
명시적으로 선언한 생성자가 한 개라도 있다면, 컴파일러는 기본 생성자를 추가하지 않는다.
명시적으로 선언하는 이유는 객체를 다양하게 초기화하기 위함
public class HelloWorld {
// 생성자 선언하지 않음
}
==
public class HelloWorld {
public HelloWorld() { } // 기본 생성자 자동 추가
}
HelloWorld hi = new HelloWorld();
( 기본 생성자 )
public Korean(String name, String gender) {
this.name = name;
(필드) (매개변수)
this.gender = gender; // 필드값과 매개변수의 값을 일치시키는 것이 보편적
}
생성자 오버로딩 가능, this 키워드로 생성자 중복 값 제거 가능
- Method
객체의 동작에 해당하는 중괄호 { } 블록
중괄호 블록은 이름을 가지는데 이것이 메소드의 이름이다.
메소드를 실행하면 블록 내의 모든 코드들이 일괄적으로 실행된다.
필드를 읽고 수정하는 역할부터 다른 객체를 생성해서 활용하는 등 다양한 역할을 수행
객체간의 데이터 전달의 수단으로 사용된다.
외부로 부터 매개값을 받을 수 있고 실행 후 어떤 값을 리턴할 수도 있다.
선언부(리턴타입, 메소드이름, 매개변수선언)와 실행 블록으로 구성된다.
메소드의 선언부를 메소드 시그너처(signature)라고도 한다.
naming convention
메소드의 이름은 숫자를 사용하면 안되고, $와 _를 제외한 특수 문자를 사용하지 말아야 한다.
관례적으로 메소드의 이름은 소문자로 작성한다.
서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫머리 글자는 대문자로 작성한다.
클래스 내부에 같은 이름의 메소드를 여러개 선언하는 것을 오버로딩(overloading)이라고 한다.
오버로딩 시 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다.
실행시 JVM은 매개값의 타입을 보고 메소드를 선택한다.
클래스 정의하는 방법
Class
인스턴스
자바에서 클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체(object)를 선언해야 합니다.
이렇게 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스 화라고 합니다.
또한, 이렇게 선언된 해당 클래스 타입의 객체를 인스턴스(instance)라고 합니다.
즉, 인스턴스란 메모리에 할당된 객체를 의미합니다.
자바에서는 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있습니다.
이렇게 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있습니다.
하지만 해당 클래스의 모든 메소드(method)는 해당 클래스에서 생성된 모든 인스턴스가 공유하게 됩니다.
Class Definition Syntax
클래스 정의는 다음과 같습니다.
// 클래스 정의는 class라는 키워드를 통해 사용됩니다.
// 클래스가 다른 클래스를 상속하고 있다면 extends라는 키워드를 통해 사용됩니다.
// 만약 클래스가 하나 이상의 인터페이스를 구현해야 한다면 implements라는 키워드를 사용해야 합니다.
// 클래스 access control modifier로 public이나, protected 같은 키워드를 사용할 수 있습니다.
// 또한 modifier로 abstract, final, strictfp라는 키워드를 사용할 수 있습니다.
public class Integer extends Number implements Serializable, Comparable {
// class members go here
}
abstract
abstract 키워드는 implementation이 불완전하므로 인스턴스화 할 수 없습니다.
implementation이 불완전하단 뜻은 하나 이상의 추상 메소드를 포함한다는 의미입니다.
그러므로 추상 클래스를 상속받으면 이 추상 메소드를 Overriding 해야합니다.
즉, 반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의해야 합니다.
final
final이라는 키워드가 붙은 메소드나 클래스는 상속이 불가능합니다.
그러므로 abstract랑 같이 쓸 순 없겠죠?
자기가 정의한 클래스를 상속받지 못하도록 할 때 final 키워드를 사용합니다.
final 키워드를 언제 붙여서 사용하는지 계속 Reserach 중입니다.
strictfp
Strictfp 키워드가 붙은 클래스는 모든 메소드에서 부동 소수점 계산에서 정확히 동일한 결과를 얻도록 보장합니다.
클래스 정의
객체의 상태와 행동이 정의된 하나의 클래스로 비슷한 구조를 갖되 상태는 서로 다른 여러 객체를 만들 수 있다. 그렇다면 어떻게 정의해야 할까? 먼저 클래스의 구조를 살펴보자.
- 필드(field) - 필드는 해당 클래스 객체의 상태 속성을 나타내며, 멤버 변수라고도 불린다. 여기서 초기화하는 것을 필드 초기화 또는 명시적 초기화라고 한다.
- 인스턴스 변수 - 이름에서 알 수 있듯이 인스턴스가 갖는 변수이다. 그렇기에 인스턴스를 생성할 때 만들어진다. 서로 독립적인 값을 갖으므로 heap 영역에 할당되고 gc에 의해 관리된다.
- 클래스 변수 - 정적을 의미하는 static키워드가 인스턴스 변수 앞에 붙으면 클래스 변수이다. 해당 클래스에서 파생된 모든 인스턴스는 이 변수를 공유한다. 그렇기 때문에 heap 영역이 아닌 static 영역에 할당되고 gc의 관리를 받지 않는다. 또한 public 키워드까지 앞에 붙이면 전역 변수라 볼 수 있다.
- 메소드(method) - 메소드는 해당 객체의 행동을 나타내며, 보통 필드의 값을 조정하는데 쓰인다.
- 인스턴스 메소드 - 인스턴스 변수와 연관된 작업을 하는 메소드이다. 인스턴스를 통해 호출할 수 있으므로 반드시 먼저 인스턴스를 생성해야 한다.
- 클래스 메소드 - 정적 메소드라고도 한다. 일반적으로 인스턴스와 관계없는 메소드를 클래스 메소드로 정의한다.
- 생성자(constructor) - 생성자는 객체가 생성된 직후에 클래스의 객체를 초기화하는 데 사용되는 코드 블록이다. 메소드와 달리 리턴 타입이 없으며, 클래스엔 최소 한 개 이상의 생성자가 존재한다.
- 초기화 블록(initializer) - 초기화 블록 내에서는 조건문, 반복문 등을 사용해 명시적 초기화에선 불가능한 초기화를 수행할 수 있다.
- 클래스 초기화 블록 - 클래스 변수 초기화에 쓰인다.
- 인스턴스 초기화 블록 - 인스턴스 변수 초기화에 쓰인다.
- 클래스 변수 초기화: 기본값 → 명시적 초기화 → 클래스 초기화 블록
인스턴스 변수 초기화: 기본값 → 명시적 초기화 → 인스턴스 초기화 블록 → 생성자
위의 구조를 토대로 클래스를 정의한다면 다음과 같이 코드를 작성할 수 있다.
// 클래스
class Class {
String constructor; // 인스턴스 변수
String instanceVar; // 인스턴스 변수
static String classVar; // 클래스 변수
static {
classVar = "Class Variable"; // 클래스 초기화 블록
}
{
instanceVar = "Instance Variable"; // 인스턴스 초기화 블록
}
Class() {
constructor = "Constructor"; // 생성자
}
void instanceMethod() {
System.out.println(instanceVar); // 인스턴스 메소드
}
static void classMethod() {
System.out.println(classVar);// 클래스 메소드
}
}
접근 제어자 - public, protected, default, private
그 외 - static, final, abstract, transient, synchronized, volatile etc.
static이나 public같은 키워드를 제어자(modifier)라고 하며, 클래스나 멤버 선언 시 부가적인 의미를 부여한다.
- 접근 제어자 - 접근 제어자는 해당 클래스 또는 멤버를 정해진 범위에서만 접근할 수 있도록 통제하는 역할을 한다. 클래스는 public과 default밖에 쓸 수 없다. 범위는 다음과 같다. 참고로 default는 아무것도 덧붙이지 않았을 때를 의미한다.
- static - 변수, 메소드는 객체가 아닌 클래스에 속한다.
- final
- 클래스 앞에 붙으면 해당 클래스는 상속될 수 없다.
- 변수 또는 메소드 앞에 붙으면 수정되거나 오버라이딩 될 수 없다.
- abstract
- 클래스 앞에 붙으면 추상 클래스가 되어 객체 생성이 불가하고, 접근을 위해선 상속받아야 한다.
- 변수 앞에 지정할 수 없다. 메소드 앞에 붙는 경우는 오직 추상 클래스 내에서의 메소드밖에 없으며 해당 메소드는 선언부만 존재하고 구현부는 상속한 클래스 내 메소드에 의해 구현되어야 한다. 상속과 관련된 내용은 6주차에 다룰 예정이다.
- transient - 변수 또는 메소드가 포함된 객체를 직렬화할 때 해당 내용은 무시된다.
- synchronized - 메소드는 한 번에 하나의 쓰레드에 의해서만 접근 가능하다.
- volatile - 해당 변수의 조작에 CPU 캐시가 쓰이지 않고 항상 메인 메모리로부터 읽힌다.
자바의 식별자 작성 규칙
번호 | 작성 규칙 | 예 |
1 | 하나 이상의 문자로 이루어져야 한다. | Tea, Coffee |
2 | 첫 번째 글자는 숫자가 올 수 없다. | Tea, 5Tea(X) |
3 | '$', '_'외의 특수 문자는 사용할 수 없다. | $Tea, _Tea, @Tea(X), #Tea(X) |
4 | 자바 키워드는 사용할 수 없다. | int(x) for(x) |
한글이나 영어로 만들 수는 있지만, 영어로 작성하고 단일 단어일 경우 첫 자를 대문자로 나머지는 소문자로 작성한다.
혼합된 이름이라면 각 단어의 첫 머리 글자는 대문자로 작성하는 것이 관례이다.
Tea, Coffee, CoffeeShop, Member, ChatClient, ChatServer
'Language > JAVA' 카테고리의 다른 글
4주차 과제 : live-study dash board 만들기 (0) | 2021.02.23 |
---|---|
5주차 과제 : 메소드 정의하는 방법 (0) | 2021.02.18 |
5주차 과제: 클래스 (0) | 2021.02.17 |
4주차 과제 : JUnit 5 (0) | 2021.02.17 |
3주차 과제 : (optional) Java 13. switch 연산자 (0) | 2021.02.15 |