상수
final : 변하지 않는 값(상수)
상수는 상태를 표현하는 변하지 않는 수
컴퓨터의 상태 등 절대 변하지 않는 값을 상수로 설정한다.
회사의 코딩 규율을 만드는 데에 사용된다.
상수 클래스를 담아 놓는 클래스 및 변수는 전부 대문자로 쓰는 것이 권장사항.
static, public을 쓰는 이유?
어떤 클래스든 상태를 쉽게 사용가능하도록 하기 위해
꼭 int로 선언하는 이유?
switch 제어문을 사용하기 위해
새로운 패키지 ch12fianl 생성, 새로운 클래스 L01Final.java 생성
package com.javalesson.ch12final;
class FRUIT{
public static final int APPLE = 1;
public static final int PEACH = 2;
public static final int BANANA = 3;
//상수는 상태를 표현하는 변하지 않는 수
//변하지 않는 = final
//static, public을 쓰는 이유? 어떠 클래스든 상태를 쉽게 사용가능하도록 하기 위해
//꼭 int로 표현하는 이유? switch 제어문을 사용하기 위해
}//class end
class COMPANY{
public static final int GOOGLE = 1;
public static final int APPLE =2;
public static final int ORACLE = 3;
}//class end
public class L01Final {
public static final int main(String[] args) {
//상수는 int값이기 때문에 switch문의 key값으로 다른 클래스의 상수가 사용될 수 있다
//심각한 오류(컴파일 시 발견되지 않는 오류) 발생
//key값으로 FRUIT클래스만 사용해야 하는데 COMPANY 클래스를 사용하고 있다.
//이 문제를 L02FinalEx에서 해결하라.
int key = COMPANY.APPLE ;
switch(key){//float, double을 포함한 다른 클래스는 key값으로 사용할 수 없다
//기본데이터 타입중 문자와 정수 데이터 타입만 사용가능
case 1:System.out.println("사과입니다."); break;
case 2:System.out.println("복숭아입니다."); break;
case 3:System.out.println("바나나입니다."); break;
}
}//main end
}//class end
새로운 클래스 L02FinalEx.java생성
package com.javalesson.ch12final;
class FRUIT2{
String msg;
public static final FRUIT2 APPLE = new FRUIT2("사과");
public static final FRUIT2 PEACH = new FRUIT2("복숭아");
public static final FRUIT2 BANANA = new FRUIT2("바나나");
private FRUIT2(String msg) {
this.msg=msg;
}
}//class end
class COMPANY2{
String msg;
public static final COMPANY2 GOOGLE = new COMPANY2("구글");
public static final COMPANY2 APPLE = new COMPANY2("애플");
public static final COMPANY2 ORACLE = new COMPANY2("오라클");
private COMPANY2(String msg){
this.msg = msg;
}
}//class end
public class L02FinalEx {
public static void main(String[] args) {
//switch문은 사용불가능
//FRUIT2 key = COMPANY2.APPLE;//데이터타입이 다르기 때문에 사용할 수 없다.
//컴파일시 발견되지 않는 오류를 컴파일 시 발견되는 오류로 수정
FRUIT2 key = FRUIT2.APPLE ;
if(key.equals(FRUIT2.APPLE )){
System.out.println(FRUIT2.APPLE .msg+"입니다.");
}
else if(key.equals(FRUIT2.PEACH )){
System.out.println(FRUIT2.PEACH .msg+"입니다.");
}
else if(key.equals(FRUIT2.BANANA )){
System.out.println(FRUIT2.BANANA .msg+"입니다.");
}
//많은 회사에서 enum이 등장하기 전까지는 이렇게 사용했다.
}//main end
}//class end
ENUM을 이용하는 방법
새로운 클래스 L03Enum.java 생성
package com.javalesson.ch12final;
enum STATE{
NORMAL("시작"), LOADING("대기"), ERROR("정지");
String msg;
private STATE(String msg){
this.msg= msg;
}
}//enum end
public class L03Enum {
public static void main(String[] args) {
STATE key = STATE.NORMAL;
switch(key){
case NORMAL: System.out.println("시스템을 "+STATE.NORMAL.msg+"합니다.");break;
case LOADING: System.out.println("시스템을 "+STATE.LOADING.msg+"합니다.");break;
case ERROR: System.out.println("시스템을 "+STATE.ERROR.msg+"합니다.");break;
}
}//main end
}//class end
제네릭(Generic)
새로운 패키지 ch13generic 생성, 새로운 클래스 L01Generic.java 생성
package com.javalesson.ch13generic;
//제네릭
//전역변수(필드)의 데이터 타입을 유동적으로 지정한다.
class Animal{
String name;
public Animal(String name){
this.name=name;
}
}//class end
public class L01Generic {
public static void main(String[] args) {
Animal ani1 = new Animal("코끼리");
Animal ani2 = new Animal(0011);//시조새 <--에러가 발생했다. 해결책은?
}//main end
}//class end
해결방법 3가지.
1. 필드추가 + 생성자 오버로드 -> 필드와 생성자가 계속 추가되면 코드가 길어지고 유지보수가 힘들다.
2. name의 데이터타입 변경(Object)로 ->코드가 짧아지고, 유연성이 생긴다.
3. 제네릭 ->개발자들이 2번 방식을 고수하다가 심각한 오류가 발생해서 추가된 기능
1. name의 데이터 타입을 Object로 변경하는 방법
package com.javalesson.ch13generic;
//제네릭
//전역변수(필드)의 데이터 타입을 유동적으로 지정한다.
class Animal{
Object name;
public Animal(Object name){
this.name=name;
}
}//class end
public class L01Generic {
public static void main(String[] args) {
Animal ani1 = new Animal("코끼리");
Animal ani2 = new Animal(0011);//시조새
}//main end
}//class end
2. 필드 추가 + 생성자 오버로드로 해결하는 방법
package com.javalesson.ch13generic;
class Animal{
public name;
int intName;
public Animal(String name){
this.name=name;
}
public Animal(int name){
this.intName = name;
}
}//class end
public class L01Generic {
public static void main(String[] args) {
Animal ani1 = new Animal("코끼리");
Animal ani2 = new Animal(0011);//시조새
}//main end
}//class end
3. 제네릭을 사용하는 방법
package com.javalesson.ch13generic;
//제네릭
//전역변수(필드)의 데이터 타입을 유동적으로 지정한다.
class Animal<T>{ //T는 < > 안에 지정한 데이터 타입이 된다. 지정하지 않을 시 Object
T name;
public Animal(T name){
this.name=name;
}
}//class end
public class L01Generic {
public static void main(String[] args) {
Animal<String> ani1 = new Animal<String>("코끼리");
Animal<Integer> ani2 = new Animal<Integer>(0011);
//기본데이터 타입을 사용할 수 없음. int를 넣으면 안되고 랩퍼클래스 Integer로!
}//main end
}//class end
제네릭 예제
새로운 클래스 L02GenericCause.java 생성
package com.javalesson.ch13generic;
class Person{//사람 클래스를 저장
Object info;
public Person(Object info){
this.info=info;
}//생성자 end
}//class end
class Employee{
int rank;
public Employee(int rank){
this.rank=rank;
}//생성자 end
}//class end
class Student{
int grade;
public Student(int grade){
this.grade=grade;
}//생성자 end
}//class end
public class L02GenericCause {
public static void main(String[] args){
Person stu = new Person(new Student(100)); //Student 저장
Person emp = new Person(new Employee(100)); //Employee 저장
Student stu_info = (Student)stu.info;
//Object 데이터 타입은 모든 클래스의 조상이기 때문에 명시적으로 형변환 가능
System.out.println(stu_info.grade);
System.out.println(((Employee)emp.info).rank);
//Person emp = new Person(100);으로 객체를 생성할 경우
//java.lang.ClassCastException 에러 발생
//이유? emp.info의 데이터 타입(Integer)이 Employee로 형변환 될 수 없기 때문
}//main end
}//class end
새로운 클래스 L03GenericEx.java 생성
package com.javalesson.ch13generic;
class Pers<T extends Personable>{
//extends, implements 상관없이 부모또는 조상클래스로 Personable을 가지고있는 class만 사용가능
T info; //T는 지정하지 않으면 Object 타입이 된다.
//T는 < >안에 지정한 데이터 타입이 된다.
public Pers(T info){
this.info=info;
}
}
interface Personable{}//사람의 기준을 지정한 인터페이스. class여도 상관없음
class Stu implements Personable{
int grade;
public Stu(int grade){
this.grade=grade;
}
}
class Emp implements Personable{
int rank;
public Emp(int rank){
this.rank=rank;
}
}
class Ani{} //동물 클래스
public class L03GenericEx {
public static void main(String[] args) {
Pers<Stu> stu = new Pers<Stu>(new Stu(90));
Pers<Emp> emp = new Pers<Emp>(new Emp(1));
//Pers<Emp> emp = new Pers<Emp>(2);//컴파일 시 발견되는 오류로 바뀜
System.out.println(stu.info.grade);
System.out.println(emp.info.rank);
//Pers 클래스의 필드 info의 데이터 타입이 사람 객체만 받고 싶다.
//Pers p = new Pers(new Ani()); 동물 클래스를 받지 못하게 되었다.
}//main end
}//class end
'JAVA > 기본다지기' 카테고리의 다른 글
[JAVA] 가위바위보 게임 (1) | 2016.08.25 |
---|---|
JAVA 14일차 필기 (1) | 2016.08.24 |
[JAVA] 0~100 숫자맞추기 게임 (0) | 2016.08.18 |
JAVA 12일차 필기 (0) | 2016.08.17 |
JAVA 11일차 필기 (0) | 2016.08.16 |