순서 값 외에도 멤버필드와 생성자를 통해서 값을 입력할 수 있다.
enum의 생성자는 항상 private이다.
'Java의 정석' 카테고리의 다른 글
열거형 (3) | 2024.10.14 |
---|---|
클래스의 또 다른 정의 (0) | 2023.09.08 |
객체 배열 (0) | 2023.09.08 |
클래스와 객체의 정의와 용도 (0) | 2023.09.08 |
객체지향언어 (0) | 2023.09.08 |
순서 값 외에도 멤버필드와 생성자를 통해서 값을 입력할 수 있다.
enum의 생성자는 항상 private이다.
열거형 (3) | 2024.10.14 |
---|---|
클래스의 또 다른 정의 (0) | 2023.09.08 |
객체 배열 (0) | 2023.09.08 |
클래스와 객체의 정의와 용도 (0) | 2023.09.08 |
객체지향언어 (0) | 2023.09.08 |
#열거형 (enum)
- 관련된 상수들을 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공
enum 에 저장된 값들은 자동으로 0부터 값을 부여받는다. 순서를 부여받는다.
즉 enum은 static final int 인 것이다.
관련된 Static final 상수들을 관련되게 묶어 놓은 것.
자바는 값과 타입이 둘 다 같아야 같다 라고 한다. 그래서 값이 같더라도 타입이 다르다면 다르다.
그래서 if(Card.Kind.CLOVER == Card.Value.TWO) 는 컴파일 에러가 난다. 타입이 달라서 비교가 불가능하다.
#열거형의 정의와 사용
- 열거형을 정의하는 방법
enum 열거형 이름 { 상수명1, 상수명2, ... }
enum Direction { EAST, SOUTH, WEST, NORTH }
- 열거형 타입의 변수를 선언하고 사용하는 방법
- 열거형 상수의 비교에 ==와 compareTo() 사용가능
==, equals()는 값을 비교하고
compareTo()는 이전 값에서 파라미터를 뺀 값을 반환한다.
비교 연산자는 불가능하지만 compareTo()는 가능 -> dir.compareTo(Direction.WEST) > 0 은 가능
#열거형의 조상 - java.lang.Enum
- 모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다.
for문을 통해서 값들을 출력할 수 있다.
배열로 받을 수도 있다. vlaues()를 통해서 배열을 반환한다.
switch문에서는 case 값에 Direction.EAST 값을 쓸 수 없고, EAST 값이 들어갈 수 있다.
#enum 선언 방법
참고 - https://www.youtube.com/watch?v=ODHC-n4mpMY&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=142
열거형 - 열거형 멤버 추가하기 (3) | 2024.10.14 |
---|---|
클래스의 또 다른 정의 (0) | 2023.09.08 |
객체 배열 (0) | 2023.09.08 |
클래스와 객체의 정의와 용도 (0) | 2023.09.08 |
객체지향언어 (0) | 2023.09.08 |
1. 클래스 - 데이터와 함수의 결합
변수 - 하나의 데이터를 저장할 수 있는 공간
배열 - 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
구조체 - 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
클래스 - 데이터와 함수의 결합(구조체 + 함수)
변수와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 했다.
2. 클래스 - 사용자정의 타입(user-defined type)
자바에서는 클래스가 곧 사용자 정의 타입이다.
// 시간, 분, 초 변수 선언
int hour;
int minute;
float second;
// 3개의 변수 선언
int hour1, hour2, hour3;
int minute1, minute2, minute3;
float second1, second2, second3;
// 배열로 선언
int[] hour = new int[3];
int[] minute = new int[3];
float[] seconde = new float[3];
// 관련된 변수들을 구조체 클래스에 모아서 선언
class Time {
int hour;
int minute;
float second;
}
열거형 - 열거형 멤버 추가하기 (3) | 2024.10.14 |
---|---|
열거형 (3) | 2024.10.14 |
객체 배열 (0) | 2023.09.08 |
클래스와 객체의 정의와 용도 (0) | 2023.09.08 |
객체지향언어 (0) | 2023.09.08 |
많은 수의 객체를 다뤄야할 때, 배열로 다루면 편리할 것이다. 객체 역시 배열로 다루는 것이 가능하며, 이를 '객체 배열'이라고 한다. 그렇다고 객체 배열 안에 객체가 저장되는 것은 아니고, 객체의 주소가 저장된다. 사실 객체 배열은 참조변수들을 하나로 묶은 참조 변수 배열일 것이다.
Ty[] tvArr = new Tv[3]; // 참조변수 배열(객체 배열)을 생성
// 객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
// 배열의 초기화 블럭을 사용하면, 다음과 같이 한줄로 간단히 할 수 있다.
Tv[] tvArr = { new Tv(), new Tv(), new Tv() };
// 다뤄야할 객체의 수가 많을 때는 for문을 사용하면 된다.
Tv[] tvArr = new Tv[100];
for(int i=0; i<tvArr.length; i++) {
tvArr[i] = new Tv();
}
열거형 (3) | 2024.10.14 |
---|---|
클래스의 또 다른 정의 (0) | 2023.09.08 |
클래스와 객체의 정의와 용도 (0) | 2023.09.08 |
객체지향언어 (0) | 2023.09.08 |
상수와 리터럴 (0) | 2023.09.07 |
클래스의 정의와 용도는 다음과 같다.
클래스의 정의 - 객체를 정의해 놓은 것이다.
클래스의 용도 - 객체를 생성하는데 사용된다.
객체의 정의 - 실제로 존재하는 것. 사물 또는 개념
프로그래밍에서의 객체 - 클래스에 정의된 내용대로 메로리에 생성된 것을 뜻한다.
객체지향 프로그래밍은 정해진 규칙들을 이용해서 코드 간에 서로 관계를 맺어 유기적으로 프로그램을 구성하는 것이다.
객체지향언어의 주요특징은 다음과 같다.
1. 코드의 재사용성이 높다.
새로운 코드를 작성할 대 기존의 코드를 이용하여 쉽게 작성할 수 있다.
2. 코드의 관리가 용이하다.
코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.
객체지향 프로그래밍은 프로그래머에게 거시적 관점에서 설계할 수 있는 능력을 요구하기 때문에 객체지향개념을 이해했다 하더라도 자바의 객체지향적 장점들은 충분히 활용한 프로그램을 작성하기란 쉽지 않을 것이다. 일단 프로그램을 기능적으로 완성한 다음 어떻게 하면 보다 객체지향적으로 코드를 개선할 수 있을지를 고민하여 점차 개선해 나가는 것이 좋다.
'상수(constant)'는 변수와 마찬가지로 '값을 저장할 수 있는 공간'이지만, 변수와 달리 한번 값을 저장하면 다른 값으로 변경할 수 없다. 상수를 선언하는 방법은 변수와 동일하며, 단지 변수의 타입 앞에 키워드 'final'을 붙여주기만 하면 된다.
그리고 상수는 반드시 선언과 동시에 초기화해야 하며, 그 후 부터는 상수의 값을 변경하는 것이 허용되지 않는다.
final int MAX_SPEED; // 에러. 상수는 선언과 동시에 초기화해야함
final int MAX_VALUE = 100; // OK. 선언과 동시에 초기화했음
MAX_VALUE = 200; // 에러. 상수의 값은 변경할 수 없음
변수(variable) - 하나의 값을 저장하기 위한 공간
상수(constant) - 값을 한번만 저장할 수 있는 공간
리터럴(literal) - 그 자체로 값을 의미하는 것
상수가 필요한 이유
그냥 리터럴을 직접 쓰면 될 텐데, 굳이 상수가 따로 필요한가?라는 의문이 들 것도 같다.
int triangleArea = (20 * 10) / 2; // 삼각형의 면적을 구하는 공식
int rectangleArea = 20 * 10 ; // 사각형의 면적을 구하는 공식
----------------------------------
final int WIDTH = 20; // 폭
final int HEIGHT = 10; // 높이
int triangleArea = (WIDTH * HEIGHT) / 2; // 삼각형의 면적을 구하는 공식
int rectangleArea = WIDTH * HEIGHT ; // 사각형의 면적을 구하는 공식
상수를 이용해서 기존의 코드를 변경한 것인데, 이전 코드에 비해 면적을 구하는 공식의 의미가 명확해졌다.
그리고 다른 값으로 계산할 때도 여러 곳을 수정할 필요없이 상수의 초기화만 다른 값으로 해주면 된다.
자료형은 크게 '기본형'과 '참조형' 두 가지로 나눌 수 있는데, 기본형 변수는 실제 값을 저장하는 반면, 참조형 변수는 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다.
기본형(primitive type)
- 논리형(boolean), 문자형(char), 정수형(byte,short,int,long), 실수형(float,double)
계산을 위한 실제 값을 저장한다. 모두 8개
참조형(reference type)
- 객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입.
클래스 이름 변수 이름; // 변수의 타입이 기본형이 아닌 것들은 모두 참조변수이다.
Date today = new Date(); // Date객체를 생성해서, 그 주소를 today에 저장
객체를 생성하는 연산자 new의 결과는 생성된 객체의 주소이다. 이 주소가 대입연산자 '='에 의해서 참조변수 today에 저장되는 것이다.
참조변수는 null 또는 객체의 주소를 값으로 갖으며 참조변수의 초기화는 다음과 같이 한다. null은 어떤 객체의 주소도 저장되어 있지 않음을 뜻한다.