본문 바로가기

Java/Java 2

[Java] 3. 자바 기본문법 2

반응형

1. 조건문

1) if 문

if(조건식) {
    실행 코드 블럭
}

 

 

// if, else if
if(power < 10) {
    slowdown();
}
else if((power > 100) && (time <= 50) {
    gofaster();
}
else {
    go();
}

 

 

// if, else if
if(power < 10) {
    slowdown();
}
else if((power > 100) && (time <= 50) {
    gofaster();
}
else {
    go();
}

2) switch

switch(입력 변수) {
    case 조건값: 실행 구문;break;
    ..
    default: 기본 실행 구문;
}

3) 3항 연산

조건? true인 경우 수행문장 : false인 경우 수행문장;

 

 

String result = (login)? "로그인성공":"로그인실패";

2. 반복문

1) for문

for(초깃값 ; 조건식 ; 증감식) {
    ...
}

 

 

for(변수 : 집합형데이터) {
    ...
}

2) while문

while(조건식) {
    ...
}

3) do~while문

do {
    ...
} while(조건식);

3. 배열

데이터를 순차적으로 저장해 0부터 시작하는 인덱스를 통해 접근

int scores[] = {95,100,87,91};
int[] scores = {95,100,87,91};
int[] scores = new int[4];
scores[2] = 90; // 3번째 요소(87)을 90으로 변경.

System.out.println(scores[0]);

 

배열 주요 메서드

자바에서 배열을 다루기 위한 메서드는 정의되어 있는 Arrays 클래스의 메서드를 활용한다.

  • 배열은 크기가 고정되어 있고 데이터를 다루기가 불편함.
  • 따라서 List 등으로 변경해서 처리할 필요가 있음.
  • Arrays 클래스의 모든 메서드는 static 이므로 인스턴스 생성 없이 사용 가능.
  • java.util 패키지 import가 필요함.

1) asList()

  • 배열을 ArrayList 로 반환해 자바 컬렉션 API를 사용할 수 있다.
  • 다만 반환되는 ArrayList 는 크기가 고정된 타입으로 새롭게 값을 추가할수 없다.
String[] cars = {"hyundai","bmw","benz","toyota"};
ArrayList car_list = Arrays.asList(cars);

2) toString()

  • 모든 자바 Object 에 포함된 메서드로 기본은 Object ID를 출력함.
  • 배열 자체를 System.out.println() 등에서 출력하면 데이터가 출력되지 않고 Object ID가 출력됨.
  • Arrays.toString()을 이용하면 데이터를 출력할 수 있음.
System.out.println(cars);  // Object ID가 출력됨.
System.out.println(Arrays.toString(cars));  // ["hyundai","bmw","benz","toyota"]

3) sort()

  • 배열원소를 정렬한다. 원본 배열 자체가 원소들이 정렬된 순서로 변경됨.
  • sort(array, Comparator), sort(array, int fromindex, int toindex)​를 이용해 내림차순 정렬 및 구간 정렬 등이 가능하다.
  • 구간 정렬의 경우 fromindex ~ toindex-1 까지를 범위로 함.
Arrays.sort(cars);  // [benz, bmw, hyundai, toyota]
Arrays.sort(cars, Collections.reverseOrder());  // [toyota, hyundai, bmw, benz]
Arrays.sort(cars, 0,2); // [hyundai, toyota, bmw, benz]

4) copyOf()

  • 배열을 복사해서 새로운 배열로 반환.
  • copyOfRage() 는 특정 범위만 반환.
  • 구간 복사의 경우 fromindex ~ toindex-1 까지를 범위로 함.
// 앞의 마지막 예제 결과에 이어짐.
String[] cars_copied = Arrays.copyOf(cars);  //[hyundai, toyota, bmw, benz]
String[] cars_copied = Arrays.copyOfRange(cars, 0,2);   // [hyundai, toyota]

5)다차원 배열

  • 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열
  • 3차원 배열은 배열 요소로 2차원 배열을 가지는 배열
  • 4차원 배열은 배열 요소로 3차원 배열을 가지는 배열
int[][] allScores = { {90,85,70,55,60},{96,88,81,91,75} ....};

allScores[0][1] 과 같이 사용 -> 85

int[][][] allScores = { 
    {
        {90,85,70,55,60},
        {96,88,81,91,75},
        {96,88,81,91,75},
        {96,88,81,91,75}
    },
    {
        {91,82,73,54,65},
        {96,87,88,99,80},
        {91,82,83,94,75},
        {96,87,88,99,70}
    },
    {
        {92,83,74,55,66},
        {97,88,89,90,71},
        {92,83,84,95,76},
        {97,88,89,90,71}
    }
    ...    
};

allScores[1][2][0] 과 같이 접근. -> 91


4. 키보드입력과 로깅

컴퓨터 프로그램의 기본 구조는 입력 -> 처리 -> 출력 의 과정

 

키보드 입력

표준 입출력

키보드는 표준입력 장치로 System.in 으로 정의 되어 있으며 표준 출력의 경우 System.out 로 정의

이들 객체는 각각 java.io.InputStream, java.io.PrintStream 클래스의 인스턴스 java.util.Scanner

 

java.util.Scanner

Scanner 클래스는 입력 스트림으로 부터 데이터를 읽어오기 위한 유틸리티 클래스 입니다. 스트림은 데이터 입출력을 위한 일종의 통로로 파일과 연결된 스트림을 사용하면 파일로 부터 데이터를 읽을 수 있고 네트워크와 연결된 스트림을 사용하면 네트워크 통신을 통해 데이터를 읽을 수 있는 개념 입니다.

사용하기전에 java.util 패키지를 import 해주어야 합니다.Scanner 클래스는 입력 스트림으로 부터 데이터를 읽어오기 위한 유틸리티 클래스 입니다. 스트림은 데이터 입출력을 위한 일종의 통로로 파일과 연결된 스트림을 사용하면 파일로 부터 데이터를 읽을 수 있고 네트워크와 연결된 스트림을 사용하면 네트워크 통신을 통해 데이터를 읽을 수 있는 개념 입니다.

사용하기전에 java.util 패키지를 import 해주어야 합니다.

Scanner scan = new Scanner(System.in);
String name = scan.next();
int num = scan.nextInt();
  • Scanner 객체 생성시 입력 스트림을 지정할 수 있음(키보드 이외 파일이나 네트워크도 가능)
  • 입력값을 문자열로 반환하는 next()를 비롯해 nextByte(), nextInt() 등 데이터 타입에 따른 메서드 존재.
  • 입력값이 공백으로 구분되어 한줄로 입력될 경우 공백을 기준으로 다음 데이터를 찾게됨.
  • 따라서 한줄 전체를 문자열 입력으로 처리하려면 nextLine()을 사용해야함.
  • hasNext() 는 다음 데이터가 있는지 true/false 로 알려줌.

 

로깅

프로그램에서 기록을 위해 메시지를 남기는 것을 로깅이라고 합니다. 예를 들면 웹서버의 경우 모든 사용자의 접속 데이터를 서버 로그로 저장하고 있습니다. 또한 프로그램 수행과정에서 발생하는 각종 정보들과 에러 메시지 들도 참고를 위해 모두 기록 됩니다.

지금까지 예제에서 프로그램 동작을 확인하기 위해 System.out.println() 을 사용해 왔습니다. 이는 콘솔에 메시지를 출력하는 것으로 실제 우리가 사용하는 프로그램들은 GUI를 통해 화면에 메시지가 출력되므로 System.out.println()을 사용할 일이 없습니다.

프로그램의 결과 뿐만 아니라 변수의 값을 확인하거나 상태를 확인하기 위해 System.out.println()을 사용할 수 있습니다. 그러나 이렇게 단순하게 출력문을 사용하는 것은 체계적으로 기록을 남기거나 관리하기 어려운 문제가 있습니다.

예를들어 실제 프로그램 개발에는 로그 메시지들을 매일 새로운 파일에 저장하거나 파일의 용량이 일정크기 이상이 되면 다른 파일로 생성하고 3달이상 지난 로그들은 삭제한다던가 하는 작업들이 필요하게 됩니다.

로깅 프레임워크(Logging Framework)

로깅 프레임워크는 바로 앞의 문제점들을 해결하기 위한 소프트웨어로 log4j, slf4j, logback 등이 유명 합니다. 로거(Logger) 라고도 합니다.

  • log4j 는 가장 오래되고 많은 사용자를 가지고 있으며 다양한 설정을 통해 통합 관리가 가능.
  • logback 은 log4j 를 기반으로 빠른 속도로 log4j를 대체해 나가고 있음.
  • slf4j 는 그 자체로 로거는 아니고 다른 로거와 결합해 사용할 수 있는 일종의 표준규격 로깅 API성격 임.
  • JDK 기본 로거는 기본 API라는 점에서 편리하기는 하지만 실제 프로젝트에서는 거의 사용되지 않는다.

일반적으로 프로그램에서는 다른 로거들과의 결합이 용이한 slf4j 를 사용하고 로깅 프레임워크로는 logback을 사용하는 추세 입니다. 각각의 로깅 솔루션에 대해서는 관련 자료들을 참고하기 바랍니다.

여기서는 로깅의 개념만 정리하고 자바의 기본 로거를 이용한 로그 관리 개념을 살펴 봅니다.

java.util.logging

자바에서 기본으로 제공되는 로깅 라이브러리 입니다. 기본적으로 로그 메시지들은 다음과 같이 레벨에 따른 의미를 가지고 있어 로그를 남길때 적절하게 선택해 사용해야 합니다. 로그 레벨은 로깅 프레임워크에 따라 조금씩 다를수 있습니다.

  • SEVERE: 가장 심각한 레벨로 시스템에 문제가 발생한 경우 사용.
  • WARNING: 문제를 발생시킬수도 있는 잠재적 문제 발생시 사용.
  • INFO: 정보성 메시지로 실행기록, 입력값 확인 등에 사용.
  • CONFIG: 프로그램의 설정관련 메시지.
  • FINE: 개발자 레벨로 로거에 따라 DEBUG 레벨로 취급되기도 함. 프로그램 분석등을 위한 정보 출력에 사용.
  • FINER: 비교적 상세한 Trace 메시지로 특정 함수나 클래스 진입, 리턴등에 대한 정보가 포함됨.
  • FINEST: 가상 상세한 Trace 메시지로 시스템의 정보나 송수신된 메시지 전문등.
Logger logger = Logger.getLogger("MyLogger");
logger.info("Starting main program");
logger.log(Level.WARNING, "Data file size too big");
logger.finest(throw new Exception());
  • logger.info() 와 같이 레벨에 따른 메서드를 사용하거나 logger.log() 메서드를 사용.
  • 자바의 기본 로거는 info 레벨을 기준으로 설정되어 있으므로 fine 레벨은 출력되지 않음.(별도 설정 필요)
반응형

'Java > Java 2' 카테고리의 다른 글

[Java] 4. 객체지향 개념과 자바  (0) 2021.07.15
[Java 실습] 3. 자바 기본문법2  (0) 2021.07.15
[Java 실습] 2. 자바 기본문법  (0) 2021.07.15
[Java] 2. 자바 기본문법  (0) 2021.07.15
[Java] 1. 자바와 자바 가상머신  (0) 2021.07.15