자바 프로그램 만들기 : 구구단 프로그램 만들기
프로그램을 만들 때 가장 먼저 생각할 것: 입력과 출력 어떤 값이 입력값으로 주어지고, 어떻게 출력되어야 할 지를 가장 먼저 생각하라 구구단 프로그램 만들기 구구단 프로그램 중 2단을 만든다면 2를 입력값으로 주었을 때 어떻게 출력되어야 할지 생각 메서드 이름 ? gugudan 입력값 ? 2 출력값? 2단(2, 4, 6, 8, 10 ..., 18) 결과값 자료형? 배열 (1) gugudan 메서드에 2를 입력값으로 주면 result라는 변수에 결괏값을 넣는 코드 입력해보기 public class Gugudan { public static void main(String[] args) { result = gugudan(2); } } (2) 결괏값을 어떤 형태로 받을 것인가? 정수형 배열이 적합하다고 판단, ..
2024.03.12
자바 공부 29: 스트림
스트림이란? Java8에서 도입된 새로운 기능 간결하고 가독성 있는 코드 작성 가능 주요 특징 데이터의 흐름을 표현하여, 일관되고 간결한 방식으로 다룰 수 있음 내부 반복 요소들을 줄여 편리 결과가 필요한 시점까지 연산을 수행하지 않음 > 성능 최적화 예시 스트림을 사용하여 배열에서 짝수를 걸러내고, 역순으로 정렬 import java.util.Arrays; import java.util.Comparator; public class Stream { public static void main(String[] args) { int[] data = {5, 6, 4, 2, 3, 1, 1, 2, 2, 4, 8}; int[] result = Arrays.stream(data) // IntStream을 생성한다 .b..
2024.03.08
자바 공부 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

프로그램을 만들 때 가장 먼저 생각할 것: 입력과 출력

 

어떤 값이 입력값으로 주어지고, 어떻게 출력되어야 할 지를 가장 먼저 생각하라

 

 

 

 

구구단 프로그램 만들기

 

구구단 프로그램 중 2단을 만든다면 2를 입력값으로 주었을 때 어떻게 출력되어야 할지 생각

메서드 이름 ? gugudan

입력값 ? 2

출력값? 2단(2, 4, 6, 8, 10 ..., 18)

결과값 자료형? 배열

 

(1) gugudan 메서드에 2를 입력값으로 주면 result라는 변수에 결괏값을 넣는 코드 입력해보기

 

public class Gugudan {
    public static void main(String[] args) {
        result = gugudan(2);
    }
}

 

 

 

(2) 결괏값을 어떤 형태로 받을 것인가?

 

정수형 배열이 적합하다고 판단, int[] result = {2, 4, 6 ...., 18}과 같은 결과를 얻을 것이라고 생각하고 프로그래밍 시작

 

 

 

(3) 본격적인 프로그램 작성 시작 > gugudan 메서드 만들기

 

public class Gugudan {

    static int[] gugudan(int dan) {
        System.out.println(dan);
         return null;
    }

public static void main(String[] args) {
       
 result = gugudan(2);
    }
}

 

>> 출력 : 2

 

 

(4) 결과값을 담을 정수 배열 생성

 

public class Gugudan {

    static int[] gugudan(int dan) {

        int[] result = new int[9];         → 총 9단이므로 [9]배열 생성
        return result;         → 정수형 배열 리턴
    }

    public static void main(String[] args) {
        result = gugudan(2);    }
}

 

 

(5) result에 해당 구구단 값을 어떻게 넣어야 할 지 생각해보자. > for문 사용하기

 

public class Gugudan {
    static int[] gugudan(int dan) {
        int result[] = new int[9];
        for(int i=0; i<result.length; i++) {
            result[i] = dan * (i+1);
        }
        return result; 
    }

    public static void main(String[] args) {
        int[] result = gugudan(2);  
        for (int a:result) {
            System.out.println(a);
        }
    }
}

 

>> 출력 : 

2

4

6

...

18

 

 

 

(6) 입력받을 수 있도록 Scanner 구문 추가

 

>> 최종본

import java.util.Scanner;

public class Gugudan {
    static int[] gugudan(int dan) {
        int result[] = new int[9];
        for(int i=0; i<result.length; i++) {
            result[i] = dan * (i+1);
        }
        return result;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("구구단 몇단 출력할까요? : ");
        int[] result = gugudan(sc.nextInt());
        for (int a:result) {
            System.out.println(a);
        }
    }
}

자바 공부 29: 스트림

친환경 개발자
|2024. 3. 8. 01:53

스트림이란?

Java8에서 도입된 새로운 기능

간결하고 가독성 있는 코드 작성 가능

 

 

 

 

주요 특징

  • 데이터의 흐름을 표현하여, 일관되고 간결한 방식으로 다룰 수 있음
  • 내부 반복 요소들을 줄여 편리
  • 결과가 필요한 시점까지 연산을 수행하지 않음 > 성능 최적화

 

 

예시

스트림을 사용하여 배열에서 짝수를 걸러내고, 역순으로 정렬

import java.util.Arrays;
import java.util.Comparator;

public class Stream {
    public static void main(String[] args) {
        int[] data = {5, 6, 4, 2, 3, 1, 1, 2, 2, 4, 8};

        int[] result = Arrays.stream(data)     // IntStream을 생성한다
                .boxed()   // IntStream을 Stream<Integer>로 변경한다.
                .filter((a) -> a % 2 == 0)   // 짝수만 뽑아낸다.
                .distinct()   // 중복을 제거한다.
                .sorted(Comparator.reverseOrder())  // 역순으로 정렬한다.
                .mapToInt(Integer::intValue)  // Stream<Integer>를 IntStream으로 변경한다.
                .toArray()   // int[]배열로 반환한다.
                ;

        for (int value : result) {
            System.out.print(value + " ");}
    }
}

자바 공부 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());   // 정수를 읽어 출력
    }
}