8.Java-Basic3

5 minute read

  • call-by reference. 메소드.int.값변화x
  • 생성자. 리턴없는메소드 . 필드값 초기화
  • interface .다중상속 .생성자x
  • 다형성 - 객체1개가 여러타입
  • abstract. 메소드,필드강제 - 생성자o
  • 오버로딩 - new 메소드 생성
  • 오버라이딩 - 상속 메소드 내용 변경
  • enum - 클래스같은 상수.
  • 람다 - first class citizen (전저리)
  • 스트림 - 배열(collection) 탐색도구
  • implement 인터페이스 , extend 상속

1. 상속



public class Dog extends Animal {

    Animal dog = new Dog(); // 자식클래스로 만든 객체는 부모클래스의 자료형으로 사용o
   // Dog dog = new Animal(); 부모클래스로 만든 객체는 자식클래스의 자료형으로 사용x
    // 부모 = new 자식 -o
    // 자식 = new 부모 -x
    

    public void sleep(){
        System.out.println(this.name + " zzz");
    }


    public static void main(String[] args){
        Dog dog = new Dog();
        dog.setName("puppy");
        System.out.println(dog.name);
        dog.sleep();
    }

}





2. Overriding




public class Dog extends Animal {

    // 오버라이딩 - 변경될 부분 
    public void sleep(){
        System.out.println(this.name + " zzz");
    }

}



public class HouseDog extends Dog {

    // 오버라이딩 - 변경한 부분 
    public void sleep(){
        System.out.println(this.name + "zzz in house ");
    }

    public static void main(String[] args){
        HouseDog houseDog = new HouseDog();
        houseDog.setName("happy");
        houseDog.sleep();
    }


}





3.Overriding , Overloading




public class HouseDog extends Dog {

    // 오버라이딩 - 변경
    public void sleep(){
        System.out.println(this.name + "zzz in house ");
    }

    // 오버로딩 - 추가한 부분 
    public void sleep(int hour) {
        System.out.println(this.name+" zzz in house for " + hour + " hours");
    }

    public static void main(String[] args){
        HouseDog houseDog = new HouseDog();
        houseDog.setName("happy");
        houseDog.sleep();
        houseDog.sleep(3); // 오버로딩 
    }


}






4. Constructor





public class HouseDog extends Dog {

    // 오버라이딩 - 변경
    public void sleep(){
        System.out.println(this.name + "zzz in house ");
    }

    // 오버로딩 - 추가한 부분
    public void sleep(int hour) {
        System.out.println(this.name+" zzz in house for " + hour + " hours");
    }

    // 생성자 - 리턴없는 메소드 , 클래스명과 동일 , new 키워드 사용시 호출
    public HouseDog(String name){
        this.setName(name);
    }

    // 생성자 오버로딩
    public HouseDog(int type) {
        if (type == 1) {
            this.setName("yorkshire");
       } else if (type == 2) {
            this.setName("bulldog");
        }
    }

    public static void main(String[] args){

        // 생성자의 규칙과 다를경우 오류
        HouseDog dog = new HouseDog("happy"); // 오버로딩한 생성자1.
        System.out.println(dog.name);
        
        HouseDog york = new HouseDog(1); // 오버로딩한 생성자2.
        System.out.println(york.name);
    }


}




5. Intercace




public class ZooKeeper {

//    // interface 구현전
//    public void feed(Tiger tiger){
//        System.out.println("feed apple");
//    }
//    public void feed(Lion lion){
//        System.out.println("feed banana");
//    }

    // interface 구현후
    public void feed(Predator pre){
        System.out.println("feed " + pre.getFood() );
    }

    public static void main(String[] args){
        ZooKeeper zooKeeper = new ZooKeeper();
        Tiger tiger = new Tiger();
        Lion lion = new Lion();
        zooKeeper.feed(tiger);
        zooKeeper.feed(lion);


    }

}





6. Abstract class





public interface Barkable {
    public void bark();
}



public class Animal {
    String name;

    public void setName(String name){
        this.name = name;
    }
}




public abstract class Predator extends Animal {

    public abstract String getFood();

    public boolean isPredator(){
        return true;
    }
}



public void feed(Predator pre){
    System.out.println("feed " + pre.getFood() );
    System.out.println("type:" + pre.isPredator());
}




7 . exception



public class Test {
    public void shouldBeRun() {
        System.out.println("ok thanks.");
    }

    public static void main(String[] args) {
        Test test = new Test();
        int c;
        try {
            c = 4 / 0;
        } catch (ArithmeticException e) {
            c = -1;
        } finally {
            test.shouldBeRun();
        }
    }
}












    public void sayNick(String nick) {
        try {
            if("fool".equals(nick)) {
                throw new FoolException();
            }
            System.out.println("당신의 별명은 "+nick+" 입니다.");
        } catch(FoolException e) {
            System.err.println("FoolException이 발생했습니다.");
        }
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.sayNick("fool");
        test.sayNick("genious");

    }



//
//    public void sayNick(String nick) throws FoolException {
//        if("fool".equals(nick)) {
//            throw new FoolException();
//        }
//        System.out.println("당신의 별명은 "+nick+" 입니다.");
//
//    }
//
//    public static void main(String[] args) {
//        Test test = new Test();
//
//        try {
//            test.sayNick("fool");
//            test.sayNick("genious");
//
//        } catch (FoolException e ) {
//            System.err.println("FoolException이 발생");
//        }
//    }







8. Thread





public class Test extends Thread {
    int seq;
    public Test(int seq){
        this.seq = seq;
    }

    public void run() {
        System.out.println(this.seq + "threed run");
        try {
            Thread.sleep(1000);
        } catch (Exception e) {

        }
        System.out.println(this.seq +"  thread end ");
    }
//
//    public static void main(String[] args){
//        for(int i =0; i<10; i++){
//            Thread t = new Test(i);
//            t.start();
//        }
//        System.out.println("main end");
//    }
//
    public static void main(String[] args) {
        ArrayList<Thread> threads = new ArrayList<Thread>();
        for(int i = 0 ; i<10; i++){
            Thread t = new Test(i);
            t.start();
            threads.add(t);
        }

        for(int i = 0 ; i < threads.size();i++){
            Thread t = threads.get(i);
            try {
                t.join(); // 쓰레드가 종료후 다음로직을 실행하는 메소드
            } catch (Exception e) {

            }
        }
        System.out.println("main end.");
    }




}




public class Test implements Runnable {
    int seq;
    public Test(int seq){
        this.seq = seq;
    }

    public void run() { // Runnable 인터페이스는 run 메소드 강제 
        System.out.println(this.seq + "threed run");
        try {
            Thread.sleep(1000);
        } catch (Exception e) {

        }
        System.out.println(this.seq +"  thread end ");
    }

    public static void main(String[] args) {
        ArrayList<Thread> threads = new ArrayList<Thread>();
        for(int i = 0 ; i<10; i++){
            Thread t = new Thread(new Test(i)); // Thread의 생성자로 Runnable 객체 사용 
                                                // 상속에 좀더 유연 
            t.start();
            threads.add(t);
        }

        for(int i = 0 ; i < threads.size();i++){
            Thread t = threads.get(i);
            try {
                t.join(); 
            } catch (Exception e) {

            }
        }
        System.out.println("main end.");
    }




}






9. Nested Class




class Outer {
    private static int num = 0;
    static class Nested1 { // 네스티드 클래스
        void add(int n){ num += n;}
    }
    static class Nested2 { // 네스티드 클래스
        int get() {return num; }
    } // 맴버 클래스

    void method(){
        class LocalInner{ }
    } // 로컬 클래스
}


public class StaticNested {
    public static void main(String[] args){
        Outer.Nested1 nst1 = new Outer.Nested1();
        nst1.add(5);

        Outer.Nested2 nst2 = new Outer.Nested2();
        System.out.println(nst2.get());
    }
}





10. Lambda





interface Printable {
    void print(String s);
}
//
//class Printer implements Printable {
//    public void print(String s){
//        System.out.println(s);
//    }
//}



public class Rambda {
    public static void main(String[] args){
//        
//        Printable prn = new Printable() { // 익명클래스 - 인터페이스를 바로 가져오는 
//            @Override
//            public void print(String s) {
//                System.out.println(s);
//            }
//        };
//
//        prn.print("What is lambda");
        
        // 람다식 
        // 인터페이스 = 매개변수 -> { 식 ; };
        Printable prn = (s) -> {System.out.println(s);}; // 람다식
        prn.print("What is lambda"); 
    }
}





예제 1

int max(int a, int b) {
    return a > b ? a : b;
}

(a, b) -> a > b ? a : b



예제 2

void printVar(String name, int i) {
	System.out.println(name + " = " + i);
}

(name, i) -> System.out.println(name + " = " + i)



예제 3

int sumArr(int[] arr) {
	int sum = 0;
    for(int i: arr) {
    	sum += i;
    }
    return sum;
}

(int[] arr) -> {
	int sum = 0;
    for(int i: arr) {
    	sum += i;
    return sum;
}



Leave a comment