자바 공부 28 : 람다(lambda)
람다(lambda) 익명 함수를 의미 함수형 프로그래밍을 지원하기 위해 Java8버전부터 도입 코드 가독성 상승을 위한 축약된 형태의 문법 람다 표현식 구조 (매개변수) -> 반환할값 입력할 값을 매개변수 란에 입력받아 -> 뒤의 함수식을 거쳐 생성된 값으로 반환 단, 인터페이스 사용 시 인터페이스의 메서드가 1개 이상이면 람다 함수 사용 불가 >> 람다함수로 사용할 인터페이스는 @FunctionalInterface 어노테이션 사용 @FunctionalInterface //함수형 인터페이스: 단 한개의 메서드만 가질 수 있음. interface Cal_2 { int sum(int a, int b); } public class Lambda { public static void main(String[] ar..
2024.03.07
자바 공부 27 : 스레드
스레드란? 한 프로세스 내에서 두 가지 이상의 일을 동시에 수행하는 것 *프로세스: 동작하고 있는 프로그램을 말함 스레드 구현 시 필수 사용 메서드 run() : Thread를 상속할 경우 필수적으로 구현해야 함. 동시에 수행할 코드들을 입력하는 곳 start() : 스레드를 실행할 때 사용 public class Day24 extends Thread { public void run() { // Thread를 상속하면 run 메서드를 구현해야 함 System.out.println(this.seq + "thread start."); //스레드 시작 try { Thread.sleep(1000); //1초 대기한다. } catch (Exception e) { } System.out.println(this.se..
2024.03.02
자바 공부 26 : 예외 처리
예외 발생 예 3가지 FileNotFoundException : 파일을 찾을 수 없을 때 발생 ArithmeticException : 산술에 문제가 있을 때 발생 ArrayIndexOutOfBoundsException : 배열의 범위 바깥을 가리키는 경우 발생 예외 처리 (try ~ catch ~ finally) try문 안의 문장을 수행할 때 예외 발생하면 catch문 수행 어떤 예외가 발생하든 반드시 수행되어야하는 구문은 finally문 try { ; ; } catch(예외 1) { ; ; } catch(예외 2) { ; ; } finally { ; ; } RuntimeException & Exception RuntimeException : 실행 시 발생하는 예외 (= Unchecked Excepti..
2024.02.28
자바 공부 25 : 스태틱
static 키워드란? 클래스에서 공유되는 변수나 메서드를 정의할 때 사용하는 키워드 클래스의 인스턴스를 생성하지 않고도 클래스 자체에서 접근할 수 있도록 함 값을 공유할 수 있다. 메모리 할당을 최소화 static 변수 클래스영역에서 static키워드 사용 변수 선언 해당 클래스의 모든 객체가 해당 static 변수를 공유하게 됨 class HouseLee{ static String lastname = "이"; → static 변수 선언 } public class House { public static void main(String[] args) { HouseLee lee1 = new HouseLee(); HouseLee lee2 = new HouseLee(); → 객체 lee1, lee2 모두 las..
2024.02.26
자바 공부 24 : 접근 제어자
접근제어자란? 변수나 메서드, 생성자 등의 앞에 붙어 사용 권한을 설정하는 용도로 사용됨. 접근제어자는 다음과 같은 순서로 접근권한이 더 약해짐 private → default(기본) → protected → public private - 해당 클래스 안에서만 접근이 가능 - 같은 패키지도 다른 클래스에서는 접근 불가 public class AnotherClass { private int privateVariable; private void privateMethod() { System.out.println("private모드입니다") } } default - 가장 기본적인 권한 상태, 아무것도 안쓰면 default접근제어자가 자동 설정됨 - 동일 패키지 내에서 접근 가능 package house; → 패..
2024.02.22
자바 공부 23 : 패키지
패키지란 비슷한 성격의 클래스를 모아둔 자바의 "폴더"와 같은 개념 같은 이름의 클래스도 서로 다른 패키지에 존재 가능 서브 패키지(하위 패키지) 패키지는 폴더의 개념과 같음. 해당 하위패키지에 접근하기 위해서는 상위패키지명. 하위패키지명.클래스명 패키지 사용 시 서로 다른 클래스를 사용하기 위해서는 임포트해줘야 한다! 단, 같은 패키지 내에서는 import 없이도 사용 가능 (예) import 상위패키지명.하위패키지명; : 해당 하위패키지 임포트 or import 상위패키지명.* : 해당 상위패키지 밑의 모든 패키지 사용 가능 패키지 사용 이유 1. 클래스의 분류가 용이하다 2. 패키지가 다르다면 동일 클래스명 사용이 가능하다
2024.02.21
자바 공부 22 : 파일 입출력
파일 입출력 파일을 생성하고, 그 파일에 어떠한 내용을 입력하는 방법 FileOutputStream 파일을 생성할 수 있는 클래스 임포트 : import java.io.FileOutputStream 파일 생성 코드 : FileOutputStream output = new FileOutputStream("경로/파일명.txt"); 파일 내용 입력 : output.write(data.getBytes()); OutputStream 클래스를 상속받아 만들어진 클래스임 >> byte단위로 데이터 처리! 따라서 값을 쓰기 위해서는 String을 byte배열로 바꿔주어야한다. (예) output.write(data.getBytes()); FileWriter byte 배열로 변환할 필요 없음 (예) fw.write(da..
2024.02.17
자바 공부 21 : 콘솔 입출력
콘솔이란? 사용자의 입력을 받거나 사용자에게 문자열을 출력해주는 역할을 하는 컴퓨터와 사용자 사이의 상호작용을 담당하는 장치 콘솔입력 사용자가 직접 무언가를 입력하는 것. ★ "System.in" 을 사용하여 사용자로부터 입력을 받음. 입력 관련 임포트 내장 클래스 InputStream : byte 단위의 데이터를 읽음, 길이 고정 InputStreamReader : byte값들을 문자로 변환시켜 문자(char) 단위로 읽음, 길이 고정 BufferedReader : 길이에 상관없이 입력값을 모두 받아들임 >> 즉, 문자열(string)을 읽음 Scanner : 입력값이나 파일 등 다양한 소스에서 입력정보를 읽음. 따라 작성해보기 import java.io.IOException; import java.i..
2024.02.13
자바 공부 20 : 추상 클래스
추상클래스란? 인터페이스의 역할도 하면서 클래스의 기능도 가지고 있는 클래스. 'abstract' 키워드를 사용해 선언해야 함 인터페이스와 추상 클래스의 차이 유사한 기능을 가지고 있으나, 추상 클래스는 일반 클래스처럼 객체변수, 생성자, private 메서드 등을 가질 수 있음 그러나 다중 상속은 불가능함! 추상클래스 사용 예 abstract class Predator extends Animal { abstract String getFood(); void printFood() { Systehttp://m.out.printf("my food is %s\n", getFood()); } static int LEG_COUNT = 4; static int speed() { return LEG_COUNT * 30..
2024.02.11
자바 공부 19 : 다형성
다형성(Polymorphism)이란? 하나의 객체가 여러 개의 자료형 타입을 가질 수 있는 것 >> 복잡한 형태의 분기문을 간단하고 효율적으로 처리할 수 있다. 다형성의 장점 1) 확장성 : 상위클래스나 인터페이스의 기능을 가지는 하위클래스를 생성하여 기존 코드를 변경하지 않고 확장할 수 있다. 2) 유지관리 용이 : 클래스 간의 결합도를 낮춰 코드가 유연해지므로 수정이 필요한 해당 클래스만 수정할 수 있음 3) 유연성 : 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있음 interface 다중상속 Java에서 클래스는 다른 클래스를 다중 상속할 수 없고 오직 1개만 상속이 가능하다. 그러나 인터페이스는 다중 상속을 지원한다! (예시) interface BarkablePredator extend..
2024.02.10

자바 공부 28 : 람다(lambda)

친환경 개발자
|2024. 3. 7. 02:21

람다(lambda)

  • 익명 함수를 의미
  • 함수형 프로그래밍을 지원하기 위해 Java8버전부터 도입
  • 코드 가독성 상승을 위한 축약된 형태의 문법

 

람다 표현식 구조

(매개변수) -> 반환할값

 

 

입력할 값을 매개변수 란에 입력받아 -> 뒤의 함수식을 거쳐 생성된 값으로 반환

 

단, 인터페이스 사용 시 인터페이스의 메서드가 1개 이상이면 람다 함수 사용 불가

>> 람다함수로 사용할 인터페이스는 @FunctionalInterface 어노테이션 사용

@FunctionalInterface     //함수형 인터페이스: 단 한개의 메서드만 가질 수 있음.

interface Cal_2 {
    int sum(int a, int b);
}

public class Lambda {
    public static void main(String[] args) {
        Cal_2 mc1 = (a, b) -> a+b;     //인터페이스에 이미 입력값의 자료형이 정의되어 있으므로 (a, b)만 써도 가능
        Cal_2 mc2 = Integer::sum;     //Integer.sum(int a, int b)과도 동일하므로 Integer::sum으로도 요약 가능
        int result1 = mc1.sum(3, 4);
        int result2 = mc2.sum(3, 4);
        System.out.println(result1);
        System.out.println(result2);
    }
}

 

함수형 인터페이스 : BiFunction, BinaryOperator

두 인수를 받아 하나의 결과를 생성하는 기능 구현 시 사용

인터페이스 선언 없이 사용하여

더 축약하여 표현 가능한 방법이다.

 

BiFunction은 <>제네릭스 안에 입력항목 2개, 출력항목 1개의 자료형을 입력,

BinaryOperator는 입출력항목의 자료형이 모두 동일한 경우 <>제네릭스 안이 1가지만 사용


import java.util.function.BiFunction;
import java.util.function.BinaryOperator;  //입출력항목이 모두 동일할 경우

public class Lambda {
    public static void main(String[] args) {
        BiFunction<Integer, Integer, Integer> mc3 = (a, b) -> a+b;  
                                                                    //제공되는 인터페이스인 BiFunction으로 더 축약 표현 가능
                                                                    // BiFunction<입력자료형1, 입력자료형2, 출력자료형3>
        int result3 = mc3.apply(3,4);       // sum이 아닌 apply메서드를 사용해야 함
        System.out.println(result3);

        BinaryOperator<Integer> mc4 = (a, b) -> a+b;
        int result4 = mc4.apply(3, 4);
        System.out.println(result4);
    }
}

 

자바 공부 27 : 스레드

친환경 개발자
|2024. 3. 2. 23:15

스레드란?

한 프로세스 내에서 두 가지 이상의 일을 동시에 수행하는 것

      *프로세스: 동작하고 있는 프로그램을 말함

 

 

 

 

스레드 구현 시 필수 사용 메서드

  • run() : Thread를 상속할 경우 필수적으로 구현해야 함. 동시에 수행할 코드들을 입력하는 곳
  • start() : 스레드를 실행할 때 사용

 

    <예시>

public class Day24 extends Thread {
   public void run() {     // Thread를 상속하면 run 메서드를 구현해야 함
        System.out.println(this.seq + "thread start.");     //스레드 시작
        try {
             Thread.sleep(1000);     //1초 대기한다.
         } catch (Exception e) {
         }        System.out.println(this.seq + "thread end.");     //스레드 종료
    }

  public static void main(String[] args) {
       for (int i=0; i<10; i++) {      // 총 10개의 스레드를 생성하여 실행한다.
           Thread t = new Day24(i);
           t.start();    // start로 스레드를 실행
       }
        System.out.println("main end.");   // main메서드 종료

        → 0~9까지 동시에 실행되어 무작위 순서로 출력됨


 

Join 메서드

스레드가 모두 종료된 후 다음 작업을 진행해야 할 때 반드시 사용

스레드가 종료되지 않았는데 다음 작업을 진행 시 오류 발생 가능성 높아짐.

 

import java.util.ArrayList;     // Join메서드 사용 시

public class Day24 extends Thread {
    int seq;

    public Day24(int seq) {
        this.seq = seq;
    }

    public void run() {     
        System.out.println(this.seq + "thread start.");     //스레드 시작
        try {
            Thread.sleep(1000);     //1초 대기한다.
        } catch (Exception e) {
        }
        System.out.println(this.seq + "thread end.");     //스레드 종료
    }

    public static void main(String[] args) {
        ArrayList<Thread> threads = new ArrayList<>();  //
        for (int i=0; i<10; i++) {
            Thread t = new Day24(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.");
    }

 

 

 

Runnable 인터페이스 (Thread 상속 대신)

보통 Thread를 상속하기보단 Runnable인터페이스를 사용

 

Thread클래스를 상속 시 다른 클래스를 상속하지 못하기 때문

 

Runnable 인터페이스 사용 시 더 유연한 프로그램 제작 가능

 

import java.util.ArrayList; 


public class Day24 implements Runnable{
    int seq;

    public Day24(int seq) {
        this.seq = seq;
    }

    public void run() {     
        System.out.println(this.seq + "thread start.");    
        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<>();
        for (int i=0; i<10; i++) {
            Thread t = new Thread(new Day24(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.");
    }
}

자바 공부 26 : 예외 처리

친환경 개발자
|2024. 2. 28. 23:57

예외 발생 예 3가지

  • FileNotFoundException : 파일을 찾을 수 없을 때 발생
  • ArithmeticException : 산술에 문제가 있을 때 발생
  • ArrayIndexOutOfBoundsException : 배열의 범위 바깥을 가리키는 경우 발생

 

 

예외 처리 (try ~ catch ~ finally)

 

try문 안의 문장을 수행할 때 예외 발생하면 catch문 수행

어떤 예외가 발생하든 반드시 수행되어야하는 구문은 finally문

 

try {
    <수행할 문장 1>;
    <수행할 문장 2>;
} catch(예외 1) {
    <수행할 문장 A>;
    <수행할 문장 B>;
} catch(예외 2) {
    <수행할 문장 a>;
    <수행할 문장 b>;
} finally {
    <수행할 문장 I>;
    <수행할 문장 II>;
}

 

 

RuntimeException & Exception

  • RuntimeException : 실행 시 발생하는 예외  (= Unchecked Exception)
  • Exception : 컴파일 시 발생하는 예외  (= Checked Exception)

 

 

 

예외 던지기 - throw, throws

  • throw: 메서드 내에서 예외 강제로 발생시키는 데 사용
  • throws: 메서드 선언부에 사용되어, 해당 메서드가 처리하지 않은 예외를 호출하는 쪽에서 처리하도록 전달

 

 

 

 

 

import java.io.*;

class FoolException extends Exception {
}

public class Day23 {

    public void sayNick(String nick) throws FoolException{
        if("바보".equals(nick)) {
            throw new FoolException();
        }
        System.out.println("당신의 별명은 "+nick+"입니다.");

    }
    public void shouldBeRun() {
        System.out.println("Ok, Thanks!");
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("나없는파일"));
        br.readLine();
        br.close();   // 존재하지 않는 파일 오류 : FileNotFoundException

        int c = 4/0;    // 산술에 문제 발생 오류 : ArithmeticException

        int[] a = {1, 2, 3};
        System.out.println(a[3]);   // 배열의 범위 밖을 가리킬 때 오류 : ArrayIndexOutOfBoundsException

        // 예외처리 : try ~ catch 구조
        int d1;
        try {
            d1 = 4 /0;
        } catch (ArithmeticException e) {
            d1 = -1;     // 예외가 발생하므로 이 문장이 수행됨
        }
        System.out.println(d1);

        // finally : 어떤 에러가 발생해도 반드시 실행되어야하는 경우 처리
        Day23 day23 = new Day23();
        int d2;
        try {
            d2 = 4 /0;
        } catch (ArithmeticException e) {
            d2 = -1;     // 예외가 발생하므로 이 문장이 수행됨
        } finally {
            day23.shouldBeRun();
        }

        /*
            예외 활용하기
             RuntimeException : 실행 시 발생하는 예외  = Unchecked Exception
             Exception : 컴파일 시 발생하는 예외   =  Checked Exception
                                                                              */
        try {
            day23.sayNick("바보");    // 바보 입력 시 return으로 메서드 종료되어 출력 X
            day23.sayNick("야호");    // 바보 외의 입력값이므로 출력 O
        } catch (FoolException e) {
            System.err.println("FoolException이 발생했씁니다.");
        }

    }
}

자바 공부 25 : 스태틱

친환경 개발자
|2024. 2. 26. 18:55

static 키워드란?

  • 클래스에서 공유되는 변수나 메서드를 정의할 때 사용하는 키워드
  • 클래스의 인스턴스를 생성하지 않고도 클래스 자체에서 접근할 수 있도록 함
  • 값을 공유할 수 있다.
  • 메모리 할당을 최소화

 

static 변수

  • 클래스영역에서 static키워드 사용 변수 선언
  • 해당 클래스의 모든 객체가 해당 static 변수를 공유하게 됨
class HouseLee{
    static String lastname = "이";     → static 변수 선언
}

public class House {
    public static void main(String[] args) {
        HouseLee lee1 = new HouseLee();      
        HouseLee lee2 = new HouseLee();     → 객체 lee1, lee2 모두 lastname으로 "이"를 갖게됨
    }
}

 

static 메서드

  • 메서드 앞 static 키워드를 붙여 생성
  • 객체 생성 없이도 클래스를 통해 메서드 직접 호출 가능
  • 유틸리티성 메서드 작성에 많이 사용

 

import java.text.SimpleDateFormat; 
import java.util.Date;

class Util {
    public static String getCurrentDate(String fmt) {
        SimpleDateFormat sdf = new SimpleDateFormat(fmt);
        return sdf.format(new Date());
    }
}

public class Sample {
    public static void main(String[] args) {

        System.out.println(Util.getCurrentDate("yyyyMMdd"));      →오늘 날짜 출력

    }
}

 

 

 

싱글톤 패턴

  •  소프트웨어의 디자인 패턴 중 하나
  •  클래스가 단 하나의 객체만을 생성하도록  만드는 패턴
  •  클래스의 인스턴스가 한 번만 생성되고, 그 이후에는 이미 생성된 인스턴스르 반환
  •  프로그램의 오류 확률을 줄일 수 있다.
class Singleton {
    public static Singleton one;    → singleton클래스에 one이라는 static변수 작성
    private Singleton() {      → new 객체 생성을 막기 위해 생성자 private 만듦
    }

    public static Singleton getInstance() {
        if (one == null) {
            one = new Singleton();
        }
        return one;
    }
}

public class Sample {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();     →one값이 null이므로 객체 생성
        Singleton singleton2 = Singleton.getInstance();     →one객체가 이미 생성되었으므로 one값 리턴
        System.out.println(singleton1 == singleton2);     →true 출력
    }
}

자바 공부 24 : 접근 제어자

친환경 개발자
|2024. 2. 22. 22:41

접근제어자란?

변수나 메서드, 생성자 등의 앞에 붙어 사용 권한을 설정하는 용도로 사용됨.

 

접근제어자는 다음과 같은 순서로 접근권한이 더 약해짐

privatedefault(기본)  → protectedpublic

 

 

private

- 해당 클래스 안에서만 접근이 가능

- 같은 패키지도 다른 클래스에서는 접근 불가

public class AnotherClass {
    private int privateVariable;
    
    private void privateMethod() {
        System.out.println("private모드입니다")
    }
}

 

 

default

- 가장 기본적인 권한 상태, 아무것도 안쓰면 default접근제어자가 자동 설정됨

- 동일 패키지 내에서 접근 가능

 

package house;     → 패키지가 동일

class HousePark {
    String lastname = "park";
    
public static void main(String[] args) {
    HouseKim kim = new HouseKim();
    System.out.println(kim.lastname);   → HouseKim 클래스의 lastname 변수 사용 가능
}

 

 

protected

- 동일 패키지 또는 해당 클래스를 상속한 자식 클래스에서만 접근 가능

package house.person;    → 서로 다른 패키지

import house.HousePark;

public class Geuns extends HousePark {     → HousePark 상속
    public static void main(String[] args) {     
        Geuns gp = new Geuns();
        System.out.println(gp.lastname);   → 상속한 클래스의 protected 변수는 접근 가능
    } 
}

 

 

public

- 어디서든 접근 가능함

public class MyClass {
    public int publicVariable;
    
    public void publicMethod() {
        // 메서드 내용
    }
}

자바 공부 23 : 패키지

친환경 개발자
|2024. 2. 21. 23:52

패키지란

 

비슷한 성격의 클래스를 모아둔 자바의 "폴더"와 같은 개념

 

같은 이름의 클래스도 서로 다른 패키지에 존재 가능

 

 

 

 

 

서브 패키지(하위 패키지)

패키지는 폴더의 개념과 같음.

 

해당 하위패키지에 접근하기 위해서는

 

상위패키지명. 하위패키지명.클래스명

 

패키지 사용 시

서로 다른 클래스를 사용하기 위해서는 임포트해줘야 한다!

 

단, 같은 패키지 내에서는 import 없이도 사용 가능

 

 

(예)

import 상위패키지명.하위패키지명;   : 해당 하위패키지 임포트

 

                                                          or

 

import 상위패키지명.*   : 해당 상위패키지 밑의 모든 패키지 사용 가능

 

 

 

패키지 사용 이유

 

1. 클래스의 분류가 용이하다

 

2. 패키지가 다르다면 동일 클래스명 사용이 가능하다

자바 공부 22 : 파일 입출력

친환경 개발자
|2024. 2. 17. 23:26

파일 입출력

파일을 생성하고, 그 파일에 어떠한 내용을 입력하는 방법

 

 

 

 

FileOutputStream

  • 파일을 생성할 수 있는 클래스
  • 임포트 : import java.io.FileOutputStream
  • 파일 생성 코드 : FileOutputStream output = new FileOutputStream("경로/파일명.txt");
  • 파일 내용 입력 : output.write(data.getBytes());
  • OutputStream 클래스를 상속받아 만들어진 클래스임 >> byte단위로 데이터 처리! 따라서 값을 쓰기 위해서는 String을 byte배열로 바꿔주어야한다.   (예) output.write(data.getBytes());

 

FileWriter

  • byte 배열로 변환할 필요 없음  (예) fw.write(data);
  • 한줄 쓰고 나면 뒤에 \r\n 을 넣어주어야 다음 줄로 넘어감
  • 임포트 : import java.io.FileWriter;
  • 파일 생성 코드 : FileWiter fw = new FileWriter(" 경로/파일명.txt");
  • 파일 내용 입력 : fw.write("1번째 줄입니다. \r\n");

 

PrintWriter

  • println 메서드를 사용할 수 있다! (\r\n 없어도 됨)
  • 임포트 : import java.io.PrintWriter;
  • 파일 생성 코드 : PrintWiter pw = new PrintWriter(" 경로/파일명.txt");
  • 파일 내용 입력 : pw.println(data);

 

 

파일에 내용 추가하기

- 파일 생성 코드의 입력값에 ', true' 추가!!

(예) Filewriter fw = new FileWriter("c:/out.txt", true);

 

- 단, PrintWriter를 이용하고 싶다면 생성자의 파라미터로 filewriter의 객체를 전달해야 한다.

(예) Printwriter pw = new PrintWriter(new FileWriter("c:/out.txt", true));

 

 

 

작업  종료 후 닫기는 필수

객체.close()

 

자바에서는 프로그램 종료 시 파일 객체를 자동으로 닫는 기능이 있으나,

닫지 않고 다시 사용하려는 경우 오류가 발생하기 쉽다.

자바 공부 21 : 콘솔 입출력

친환경 개발자
|2024. 2. 13. 23:43

콘솔이란?

사용자의 입력을 받거나 사용자에게 문자열을 출력해주는 역할을 하는

컴퓨터와 사용자 사이의 상호작용을 담당하는 장치

 

 

콘솔입력

사용자가 직접 무언가를 입력하는 것.

 

"System.in" 을 사용하여 사용자로부터 입력을 받음.

 

 

 

입력 관련 임포트 내장 클래스

  • InputStreambyte 단위의 데이터를 읽음, 길이 고정
  • InputStreamReader : byte값들을 문자로 변환시켜 문자(char) 단위로 읽음, 길이 고정
  • BufferedReader : 길이에 상관없이 입력값을 모두 받아들임 >> 즉, 문자열(string)을 읽음
  • Scanner : 입력값이나 파일 등 다양한 소스에서 입력정보를 읽음.

 

 

따라 작성해보기

import java.io.IOException;
import java.io.BufferedReader;   // 문자열(Strint)을 읽는다 | 입력값을 길이에 상관없이 받음
import java.io.InputStream;   // byte를 읽는다 | 입력값 받아 아스키코드로 출력
import java.io.InputStreamReader;   // 문자(character)를 읽는다 | 입력값 받아 값 그래로 출력
import java.util.Scanner;


public class Day19 {
    public static void main(String[] args) throws IOException {     // IOException 예외 처리를 뒤로 미룬다(throws)
        InputStream in = System.in;    //System.in은 InputStream의 객체

        int a;
        System.out.println("1byte만 입력");
        a = in.read();  //read() : 1byte 입력 받음 >> int로 저장 (0~255정수값, 아스키코드값)

        System.out.println(a);    // 1byte 이상 입력해도 1byte만 받아서 출력함
        System.out.println();

        int b;
        int c;  // 2개의 변수 선언하면 2byte 입력값을 받을 수 있음
        System.out.println("2byte 입력");
        b = in.read();
        c = in.read();

        System.out.println(b);
        System.out.println(c);
        System.out.println();

        byte[] d = new byte[3];
        System.out.println("3byte짜리 배열 입력");
        in.read(d);

        System.out.println(d[0]);
        System.out.println(d[1]);
        System.out.println(d[2]);
        System.out.println();

        // InputStreamReader : 입력한 값을 아스키코드가 아니라 그대로 출력할 수 있음
        InputStreamReader reader = new InputStreamReader(in); // 입력값으로 InputStream 객체인 'in' 필요

        char[] e = new char[3];
        System.out.println("3byte짜리 배열 입력 - 그대로 출력");
        reader.read(e);

        System.out.println(e);
        System.out.println();

        // BufferedReader : 길이에 상관없이 모든 입력 받음
        BufferedReader br = new BufferedReader(reader); // 입력값으로 InputStreamReader의 객체인 'reader' 필요


        String f = br.readLine();   // readLine() : 사용자가 입력한 문자열 전부를 읽음
        System.out.println("문자열 입력");
        System.out.println(f);

        // Scanner
        Scanner sc = new Scanner(System.in);
        System.out.println(sc.next());   // 한개의 토큰을 읽어 출력 (토큰 : 정보의 최소 단위)
//        System.out.println(sc.nextLine());  // 한 라인을 읽어 출력
//        System.out.println(sc.nextInt());   // 정수를 읽어 출력
    }
}

 

자바 공부 20 : 추상 클래스

친환경 개발자
|2024. 2. 11. 18:42

추상클래스란?

인터페이스의 역할도 하면서 클래스의 기능도 가지고 있는 클래스.

'abstract' 키워드를 사용해 선언해야 함

 

인터페이스와 추상 클래스의 차이

유사한 기능을 가지고 있으나, 추상 클래스는 일반 클래스처럼 객체변수, 생성자, private 메서드 등을 가질 수 있음

그러나 다중 상속은 불가능함!

 

추상클래스 사용 예

abstract class Predator extends Animal {
    abstract String getFood();   

    void printFood() {     
        Systehttp://m.out.printf("my food is %s\n", getFood());
    }
    static int LEG_COUNT = 4; 

    static int speed() {   
        return LEG_COUNT * 30;
    }
}

interface Barkable {
    void bark();
}

class Animal {
    String name;

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

class Tiger extends Predator implements Barkable {
    public String getFood() {
        return "apple";
    }
    public void bark(){
        System.out.println("어흥");
    }
}
class Lion extends Predator implements Barkable {
    public String getFood() {
        return "banana";
    }
    public void bark() {
        System.out.println("으르렁");
    }
}

class Zookeeper {
    void feed(Predator predator){
        System.out.println("feed "+ predator.getFood());
    }
}

class Bouncer {
    void barkAnimal(Barkable animal) {
        animal.bark();
    }
}
public class Day17 {
    public static void main(String[] args) {
        Zookeeper zookeeper = new Zookeeper();
        Tiger tiger = new Tiger();
        Lion lion = new Lion();

        tiger.printFood();
        zookeeper.feed(tiger);  //feed apple 출력
        System.out.println();

        lion.printFood();
        zookeeper.feed(lion);   // feed banana 출력
        System.out.println();

        Predator.speed();
        System.out.println(Predator.LEG_COUNT);
        System.out.println();

        Bouncer bouncer = new Bouncer();
        tiger.bark();
        zookeeper.feed(tiger);
        lion.bark();
        bouncer.barkAnimal(tiger);
    }
}

자바 공부 19 : 다형성

친환경 개발자
|2024. 2. 10. 22:15

다형성(Polymorphism)이란?

하나의 객체가 여러 개의 자료형 타입을 가질 수 있는 것

>> 복잡한 형태의 분기문을 간단하고 효율적으로 처리할 수 있다.

 

 

 

다형성의 장점

1) 확장성 : 상위클래스나 인터페이스의 기능을 가지는 하위클래스를 생성하여 기존 코드를 변경하지 않고 확장할 수 있다.

2) 유지관리 용이 : 클래스 간의 결합도를 낮춰 코드가 유연해지므로 수정이 필요한 해당 클래스만 수정할 수 있음

3) 유연성 : 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있음

 

 

 

interface 다중상속

Java에서 클래스는 다른 클래스를 다중 상속할 수 없고 오직 1개만 상속이 가능하다.

그러나 인터페이스는 다중 상속을 지원한다!

 

(예시)

interface BarkablePredator extends Barkable, Predator {

}

 

 

 

 

다형성의 예시

아래 코드에서,

Tiger클래스의 객체인 tiger는 여러 가지 자료형으로 표현할 수 있다.

 

Tiger tiger = new Tiger();                   → Tiger is a Tiger

Animal animal = new Tiger();             → Tiger is a Animal

Predator predator = new Tiger();       → Tiger is a Predator

Barkable barkable = new Tiger();      → Tiger is a Barkable

interface Predator {
    String getFood();     // 메서드 추가 (몸통이 없음)

    default void printFood() {      // 디폴트 메서드
        System.out.printf("my food is %s\n", getFood());
    }
    int LEG_COUNT = 4;  // 인터페이스 상수

    static int speed() {    // 스태틱 메서드
        return LEG_COUNT * 30;
    }
}

interface Barkable {
    void bark();
}

interface BarkablePredator extends Barkable, Predator{
}



class Animal {
    String name;

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

class Tiger extends Animal implements BarkablePredator {
    public String getFood() {
        return "apple";
    }
    public void bark(){
        System.out.println("어흥");
    }
}
class Lion extends Animal implements BarkablePredator {
    public String getFood() {
        return "banana";
    }
    public void bark() {
        System.out.println("으르렁");
    }
}

class Zookeeper {
    void feed(Predator predator){
        System.out.println("feed "+ predator.getFood());
    }
}

class Bouncer {
    void barkAnimal(Barkable animal) {
        animal.bark();
    }
}
public class Day17 {
    public static void main(String[] args) {
        Zookeeper zookeeper = new Zookeeper();
        Tiger tiger = new Tiger();
        Lion lion = new Lion();

        tiger.printFood();
        zookeeper.feed(tiger);  //feed apple 출력
        System.out.println();

        lion.printFood();
        zookeeper.feed(lion);   // feed banana 출력
        System.out.println();

        Predator.speed();
        System.out.println(Predator.LEG_COUNT);
        System.out.println();

        Bouncer bouncer = new Bouncer();
        tiger.bark();
        zookeeper.feed(tiger);
        lion.bark();
        bouncer.barkAnimal(tiger);
    }
}