정리 노트/쌍용 KDT_(자바 Spring)

23.02.01(수): BufferedReader, read(), skip(), 이름 표기법

우주바다 2023. 2. 12. 20:52
728x90
 

오늘 배운 것

01. BufferedReader

- InputStreamReadr, IOException
02. System.in.read() 

- skip()

03. 이름 표기법 정리
+) 단축키, 주석, 변수명

 



01. BufferedReader

사용자에게 데이터를 입력받는 클래스.

우항 값이 숫자나 문자처럼 확실한 데이터가 아니기 때문에 new 키워드를 사용한다.

(기본 자료형이 아니지만, 새로 메모리에 공간 만들어줘!)
 메서드이기 때문에 ()가 붙고 괄호 안에서 인자를 받는다.

 

InputStreamReader

: 키보드 입력은 전기신호(바이트)이므로 번역기가 필요하다. 

IOException

자바는 보수적이라 불확실성을 싫어한다. 어떤 값이 입력될지 모르니

throws IOException:  예외를 발견하면 던져버린다.

 

print 출력문으로 입력받을 값을 안내하고, 

사용자가 입력하면 readLine() 메서드로 담는다.

정확하게는 입력 대기열에 남아있는 값을 담는다. '스트림' 개념. 
엔터 입력(라인 구성이 끝날 때 ) 또는 대기열에 값이 생길 때까지 대기한다.

 

실습012

더보기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test012{
	public static void main(String[] args) throws IOException{

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));																							
		/* ========== 변수 선언 ========*/ 
		int r;				// 반지름
		final double PI = 3.141592;	// 원주율(상수)
	    	double a,b;			// 원의 넓이, 둘레 
		/* ==========  연산 및 처리 ==========*/  
		System.out.print("원의 반지름 입력: ");
		 r = Integer.parseInt(br.readLine());

		a = r * r * PI;
		b = r * 2 * PI;
		System.out.printf(">> 반지름이 %d인 원의 넓이는 %.2f 이며,\n" , r,a);
		System.out.printf(">> 반지름이 %d인 원의 둘레는 %.2f 이다.\n",r,b);	
	}
}

 

실습 013

더보기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test013{
	public static void main(String[] args) throws IOException{	
    		// BufferedReader 인스턴스 생성 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int underLength, height;  // 밑변, 높이 
		double area;	// 결과값(넓이)

		System.out.println("■ 삼각형 넓이 구하기 프로그램■\n");
		System.out.print("- 삼각형의 밑변: ");
		underLength = Integer.parseInt(br.readLine()); // 밑변 
		System.out.print("- 삼각형의 높이: ");
		height = Integer.parseInt(br.readLine()); // 높이 
		area = (double)underLength * height / 2; //  넓이 (정수 연산 → 몫만 반환)
		// area = (double)(underLength * height / 2);  정수 연산 후 변환은 의미 없음
		// 다른 표현 :  area = underLength * height / 2.0;  
	
		// System.out.println(); // 인자가 없으면 개행만 실행
		// System.out.print();  // 인자가 없으면 오류
		System.out.printf("\n>>밑변이 %d, 높이가 %d 인 삼각형의 넓이: %.2f\n\n", underLength , height, area);
	}
}

실습 014, 014_1

 

import java.io.*; 

io 내부 도구를 모두 임포트. *(Asterisk)는 all을 의미.

간결하지만 도구 3개를 위해서 전체 도구를 불러온다. 짧다고 항상 좋은 코드는 아니다. 

더보기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
// import java.io.*;   : io 내부 도구 전체 임포트

public class Test014{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		/* 다른 표현: 위 구문은 아래 2줄이 합쳐진 코드. 
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);              */	
		
        String strName;
		int nKor, nEng, nMat;
		int nTotal;

		System.out.println("■ 국영수 총점 계산기 ■\n");
		System.out.print("- 이름 입력: ");
		strName = br.readLine();				
		System.out.print("- 국어 점수 입력: ");
		nKor = Integer.parseInt(br.readLine());  
		System.out.print("- 영어 점수 입력: ");
		nEng = Integer.parseInt(br.readLine());  
		System.out.print("- 수학 점수 입력: ");
		nMat = Integer.parseInt(br.readLine());		
		nTotal = nKor + nEng + nMat ;	// 총점 연산 

		System.out.println("\n===[결과]===\n" + "이름: " + strName);
		System.out.printf("총점: %d\n\n",nTotal);
		/*
			■ 국영수 총점 계산기 ■

			- 이름 입력: 우주
			- 국어 점수 입력: 90
			- 영어 점수 입력: 99
			- 수학 점수 입력: 20

			===[결과]===
			이름: 우주
			총점: 209

			계속하려면 아무 키나 누르십시오 . . .
		*/
	}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException; 

public class Test014_1 { //다른 방식으로 작성.
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(isr); 
		InputStreamReader isr = new InputStreamReader(System.in);
		             
		String strName; // 헝가리언 표기
		int nKor, nEng, nMat, nTotal;
		String strTemp; // 입력값을 임시로 담을 변수 
        // .... (중략)
	}
}

02. System.in.read() 

 

read() 메서드는 (입력대기열로부터) 한 문자만 가져온다.
 단, 받은 그대로가 아닌 ASCII Code 값.(int)
 입력대기열을 비우려면 개수를 인자로 하여 skip()을 사용한다.

 

실습 015, 015_1

read() 메서드로 값을 받고, skip 처리를 하지 않으면

정수 입력이 스킵되고 13이 출력된다.

A를 입력하고 눌렀던 '엔터'가 대기열에 남기 때문.

엔터: 다른 키들과 다르게 키가 가지는 값이 2개. 
커서를 맨 앞으로 보내고 개행한다. 이 두 값이 합쳐져 있다. (\r\n)
\r 의 아스키코드 값은 13, \n은 10. 

더보기
import java.io.IOException; 
// char이지만 입력값이므로 예외처리 필수
public class Test015{
	public static void main(String[] args) throws IOException{
		char ch;  
		char n;  		 
		System.out.print("- 한 문자 입력: ");
		ch = (char)System.in.read(); // 아스키를 원래값으로 바꿔서 저장.	
			
		System.in.skip(2);
        // 입력대기열에 남은 \r과 \n. (2)개를 건너뛴다. 
		System.out.print("- 한 자리 정수 입력: ");
		n = (char)System.in.read(); 
        // 정수도 아스키 값으로 변환되어 출력되므로 char로 형변환 
		System.out.println("\n>> 입력한 문자: " + ch);	
		System.out.println(">> 입력한 정수: " + n +"\n");
	}
}
import java.io.IOException; 
public class Test015_1{ // 아스키 코드 연산
	public static void main(String[] args) throws IOException{	
		char ch;  
		int n; 
		System.out.print("- 한 문자 입력: ");
		ch = (char)System.in.read(); 
		System.in.skip(2); 
		System.out.print("- 한 자리 정수 입력: ");
		n = System.in.read(); 
		n -= 48 ;  // 아스키 값으로 바뀌기 전의 원본 숫자로 처리 
		// read()로 받기 전까지 n의 값은 선언만 하고 초기화되지 않아서
		// -= 연산 불가능.  read() 뒤에 작성해야함. (미리 작성시 initialized error)
		System.out.println("\n>> 입력한 문자: " + ch);	
		System.out.println(">> 입력한 정수: " + n +"\n");
	}
}

03. 이름 표기법 정리

 

○ 캐멀 표기법

(Camel Notation, Camel Case, 낙타 표기법)

더보기

: 두 단어 이상의 변수 명을 표기할 때 두 번째 단어부터 첫 글자를 대문자로 표기
ex) addData, rainbowColor, userName

 

변수의 명명규칙(네이밍 룰)인 첫 글자를 반드시 소문자로 한다는 규칙과 캐멀 표기법이 합쳐진 네이밍.
자바에서 시작된 것으로, 변수명이나 클래스명을 작성할 때 단어마다 단어의 첫 글자를 대문자로 표기하는 것.
이 표기법은 각 단어의 첫 글자가 대문자로 표기되어 마치 낙타 등처럼 보이기 때문이라는 설이 있지만 사실과는 다르다.
(사실은 이 표기법이 언급된 유명한 책의 표지가 낙타였음) 


○ 파스칼 표기법 (Pascal Notation, Pascal Case)

더보기

: 첫 글자를 포함, 단어가 합성될 때마다 각 단어의 첫 글자를 대문자로 표기.
자바의 클래스 명명 규칙인 첫 글자를 대문자로 하는 규칙과 캐멀 케이스가 결합된 형태.
ex) class MainTitle , class CircleTest, class UserStatus

 

○ 언더스코어(언더라인) 표기법 

(Underscore Notation, Underscore Case, 밑줄 표기법)

더보기

* Underscore  = Underline
: 주로 데이터베이스나 자바스크립트의 지역 변수를 표기할 때 쓴다.
ex) content_name , user_data

 

○ 헝가리언 표기법 

 (Hungarianl Notation, Hungarianl Case)

 

: Microsoft 사의 Charles Simonyi라는 프로그래머가 만들었다.
그가 코딩할 때 습관적으로 즐겨 쓰던 접두사 변수 명명 방식이 빌게이츠의 눈에 띄어 표준화(일반화) 되었다.
변수 앞에 접두어를 사용해서, 자료형을 쉽게 알아볼 수 있다.

더보기

ex) int nNum  , float fNum
    argument of string -> args   (메인메서드의 args 도 헝가리언에서 따왔다.)

Data Type  Prefix      Example
boolean b  bContinue
int n nIndex
short  nNum
char cFirstInitial
string   s(str) sCustomerName
(strCustomerName)

 

* 실제 자바 프로젝트에서는 클래스는 파스칼 표기법(또는 캐멀)으로
  변수나 메서드는 캐멀, 상수화된 변수는 밑줄 표기법 사용한다.
  간혹 오래된 프로젝트 유지보수를 하다 보면 헝가리언 표기법도 자주 볼 수 있다.



● 클래스 이름 : 파스칼
:  맨 앞 글자를 대문자로 시작, 두 번째로 오는 의미 있는 단어의 앞 글자도 대문자.
ex) public class MyClass{}   // o
      public class Myclass{}    // x 

● 변수 이름 : 캐멀  
: 맨 앞 글자를 소문자로, 두 번째로 오는 의미 있는 단어의 앞 글 자는 대문자.
ex) String myName;    //  o
      String MyName;    // x 

● 메서드 이름 : 캐멀  
: 맨 앞 글자를 소문자로, 두 번째로 오는 의미 있는 단어의 

앞 글자는 대문자.( 변수명과 동일한 방법)

단, 메서드명은 가급적 동사로 시작한다.

ex) public String createMyName(){}    // o
       public String createmyname(){}     // x
       public String myName(){}    // (동사가 아닌 명사. 비추천)


+) 단축키, 주석, 변수명

더보기

단축키:   ctrl + shift + 숫자 
단축 도구 폴더 번호 선택.
우리는 1번 폴더에서 컴파일러와 런처를 사용하고 있는데
ctrl + shift + 2를 누르게 되면 2개가 다 사라진 것처럼 보인다.
ctrl + shift + 1을 누르면 첫 번째 폴더로 돌아오면서 다시 나타난다. 

주석
블록단위 주석 내부에 단일주석은 사용 가능하지만 , 같은 블럭 단위는 중첩 불가능.

수업 권장 사항 
다 같이 진행하는 예제는 가능한 변수명 통일하기.
예를 들어 int n을  혼자 int test라고 지으면
코드 비교, 리뷰할 때 헷갈림. 특히 후반부에서 전체 코드가 길어지면 더 어려워짐.


오늘 느낀 점:
혼자 예습했을 때는 강의에서 Scanner 클래스만 다뤄봤는데,
BufferedReader를 사용하니

입력값을 받고, InputStreamReader로 번역하고 IOException으로 예외처리까지

과정을 명시하면서 입력 스트림에 대해 더 자세하게 이해할 수 있었다. 

추가로 import 할 때 편하게 전체로 불러올 때가 많았는데 다기능과 성능에 대해 배울 수 있어서 좋았다.

 

한 글자만 입력받는 기능도 처음 써보았는데,

이때 입력 대기열을 비우지 않으면 엔터 값이 남아있다는 것도 신기했다.

skip()을 처음 써본 만큼 종종 잊어버리는데 잘 기억해 둬야겠다.

표기법은 알고 있었지만 어떻게 사용되고, 탄생했는지  자세하게 살펴볼 수 있어서 좋았다. 

728x90
반응형