본문 바로가기

JAVA/기본다지기

JAVA 13일차 필기

상수


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.msgmsg;

}

}//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