6day
2주차 시작~~!
코딩할 때 들여쓰기 꼭 지키자. 가독성, 유지보수 위해
do~ while문
조건식이 참/거짓여부에 상관없이 '한 번'은 do{ } 처리.
do{
}while(조건식);
1~10까지 짝수의 합을 출력하는 문제라면
반복 '횟수'가 명확함(10개 중 5번). -> for문 쓰는게 더 편리
문자의 출력값
//문자의 출력값
// 'A' 65
// 'a' 97
// ' ' (공백)32값.
// ' (') 39
System.out.printf("[%c][%d]", ' '+7, (int)' '+7);
// 공백 +7(아스키코드) = '(작은따옴표)
//[결과] ['][39]
System.in.read();
기본적으로 아스키코드 값이 입력되면 int 값(정수)으로 코드값 반환(1바이트 단위로 처리)
-> 문자로 출력하고 싶다면 (char)해서 형변환해야함
13번: enter(LF)
10번: 개행(\n)
모르는 거 쓸 때는 옆에 노란창 속 영어 한 번씩 읽어보는게 좋음
read(), readLine() && next(), nextLine()
read(),next() : 입력된 한값+ 엔터까지 담음(= LF10,CR13)
readLine(),nextLine() : 입력된 한 줄을 다 받으며 엔터 문자를 담지 않음!
next() 실행 라인에서 숫자 2와 Enter를 입력 시, nextLine()에서 입력을 기다리지 않고 바로 통과 되어 버린다.
그 이유는, nextInt()가 실행될때 숫자 2만 읽고, Enter(\r\n)값은 입력 스트림 버퍼에 남아 있기 때문이다.
따라서, nextLine() 실행 시, 남아 있는 Enter 값을 읽어 들이고 통과하게 된다.
<<이거 읽으면 대략 다 이해됨!>>
오늘 배울 내용은 자바의 기본 입출력 중에서
System.in.read()라는 메소드의 사용법에 대해서 알아보겠습니다.
25번 째 줄에 System.in.read()로 입력을 받게 되면 입력받은 문자의
ASCII코드 값으로 저장하게 됩니다.
read()메소드와 BufferedReader의 readLine()의 차이는 기본적으로
read()메소드는 기본적으로 한 글자를 읽어오는 것이고,
readLine()문자열을 읽어 오게 됩니다. 여기서 중요한 차이점은
readLine()은 Enter문자를 저장하지 않는다는 점입니다.
하지만 read()는 Enter문자까지 가져오게 되어서,
25번재 줄에서 한문자를 입력하고 Enter를 치게 되면 Enter문자까지
문자열 저장 스트림에 저장이 된다는 겁니다. 그래서 엔터는 LF, CR값이 두개가
추가로 저장되는 거죠.
하지만 걱정하지 마세요. 우리에게는 System.in.skip()함수가 있기 때문에
이것을 이용해서 스트림에 저장된 문자를 스킵해서 넘겨줄 수 있습니다.
System.in.skip(System.in.available());
: 필요한 거 쓰고 입력 스트림에 남은 모든 것을 비우겠다는 뜻!
: 다음 System.in.read() 이든 뭐든 새로 입력한 값 바로 받을 수 있게 잔존물 치우기
남은 스트림 수가 5바이트라면
== System.in.skip(5);
== System.in.read(); 이구문 필요한 만큼(5번) 반복입력
[1] abcd를 치면 abcd13/10(제어문자) 입력됨
[2] System.in.read();에서 next byte(a)만을 읽어감
[3] 남은 bcd13/10(5바이트)는 다음에서 출력되버림
[4] System.in.skip(System.in.available());
->입력 스트림에 남은 모든것을 비우겠다는 뜻
A[엔터 13 + 10] 스트림 13, 10?
13번 값을 없애줘야지 다시 읽어갈 것 - how?
13번: cr(캐리지리턴) '\r' 제어 문자
10번:LF(Line Feed) '\n' 제어 문자
int one;
//A치고 엔터입력 시 = A+ 엔터(13LF코드 + 10CR코드) 이렇게 3개의 바이트가 입력됨
//13, 10번 값 두개를 없애줘야지 다시 읽어갈 것 - how?
//13번: cr(캐리지리턴) '\r' 제어 문자
//10번:LF(Line Feed) '\n' 제어 문자
System.out.print("한 글자를 입력하세요. : ");
one = System.in.read(); //한 바이트 읽어오겠다
System.out.printf("%d\n", one);
//System.in.read(); //13 버리는용도
//System.in.read(); //10 버리는용도
//System.in.skip(2); //위에 두개쓴거랑 같음
System.in.skip(System.in.available());
//앞으로 많이 사용할 것. asdf 치면 a만 받고 나머지는 버려라
System.out.print("한 글자를 입력하세요. : ");
one = System.in.read(); //
System.out.printf("%d\n", one);
문자열변수명.charAt(indexN)
getC = name(String변수명).charAt(index번호);
: 다른 문자열 변수 속에서 내가 원하는 위치(index)의 한 문자를 반환하는 함수
index는 보통 0부터 시작
String name = "홍길동";
//홍길동 중 '홍' 자만 or 한 글자씩 가져오고 싶을 때
char getC;
getC = name.charAt(0); //원하는 문자열 변수명.charAt(원하는자리 index(0~))
System.out.println(getC);
//전체를 한 자씩 떼어오길 원한다면 (종결식에 ()잊지말기!)
int len = name.length();
//name.length();를 for문 안에 넣는 것보다 따로 변수 상정하는게 더 좋은 코딩!
for (int i = 0; i <len; i++) {
getC = name.charAt(i); //원하는 문자열 변수명.charAt(원하는자리 index(0~))
System.out.println(getC);
}
"a" == 'a' + '\0(null)'
-> 'a'만 끄집어내오기
문자열 다루는 함수
: split(),trim(),replace(),equals(),equalsIgnoreCase(), charAt()
배열 array
- 동일한 자료형 + 메모리 상에 연속적으로 놓이게 한 것
- 선언형식 : 자료형 [] 배열명 = new 자료형[배열크기];
예) 국어 점수 배열 선언
예) int [] kors = new int[3];
선 긋는 작업 반복적으로 코딩. 50줄 정도 있다고 가정 -함수(function, procedure)
함수
: 반복되는 명령어,코딩들의 묶음을 함수로 만들고 나중에도 처리하기 위함
메서드method = 멤버함수
: 클래스 안에 선언된 함수
선 긋는 함수를 메인함수 밖에 따로 선언 + 함수 선언 형식을 알아야 함
주의)) 메인함수 안에다가 함수 선언하지 말 것, 클래스 밖에 선언하지 말것
-> main 과 class 마지막 괄호 사이
[접근지정자][기타제어자][리턴자료형] 함수명-기능에 맞게{ }
당분간은 일단 public static ~ 이하로 쓸 것.
public static void drawLine() {
System.out.println("************"); //50줄
}
'함수선언부' + '함수호출부분'이 필요함
함수 사용의 장점
- 라인 수가 줄어서 컴파일 양도 줄음. (컴파일한 걸 읽어서 하니까) 실행속도도 빨라짐
- 유지보수도 쉬움
- 클래스 단위기 때문에 팀작업이 가능. 생산성 up (빠르게 만들어낼 수 있음)
package days06_night;
public class Ex02 {
public static void main(String[] args) {
//선긋는 함수 호출부 = '기능담은 함수명()'; 요 형태로 메인에 먼저 선언!
drawLine();
System.out.println("부서원 : 사원명");
drawLine(14,'-');
System.out.println("생산부 : 강하라");
System.out.println("총무부 : 권나라");
System.out.println("영업부 : 김라희");
System.out.println("생산부 : 김민주");
drawLine(2);
}//main
//함수 선언부. 선언부()안에는 반환할 매개변수 변수종류가 정해진 경우 안에 선언(int n);
private static void drawLine() {
System.out.println("**************");
}
//라인수든, *수든 for문 조건 설정해서 원하는대로 가능 --오버로딩overloading
private static void drawLine(int n) {
for (int i = 0; i < n; i++) {
System.out.println("**************");
}
}
private static void drawLine(int n, char style) {
for (int i = 0; i < n; i++) {
System.out.print(style);
if(i == n-1) System.out.println();
}
}
}//class
동일 함수 여러 번 선언
메서드명은 같고 ('매개변수')의 갯수/타입이 다른 함수 선언을 할 수 있음.
리턴자료형은 중요하지 않음 (void를 int로 바꾼다고 오버로딩할 수는 없음)
중복함수 == 오버로딩overloading == 오버로드overload
(cf) 나중에는 오버로딩, 오버라이딩 구분할 줄 알아야함. 면접에서 자주 물음)
오버로딩 정의 한번 찾아보기(구글링, 책)
오버라이딩
두 정수의 합을 구해서 반환하는 함수(메서드)를 선언하고 호출하는 예제
- 기능: 두 정수의 합을 계산해서 반환하는 함수
- 매개변수: 두 정수 int a, int b
- 리턴자료형(리턴값): int
함수 호출하는 형태 이해하기 편함! 헷갈릴 때 이거 볼 것
package days06_night;
public class Ex03_00 {
public static void main(String[] args) {
int a = 10 , b = 20;
int n = hap(a,b); //이 괄호 안에는 int(x) 변수명만
System.out.printf("%d+%d=%d\n",a,b,n);
}
//매개변수가 필요하다면 자료형+변수명 같이 기재
private static int hap(int a, int b) {
return a + b;
}
}
함수명 선언
:보통 함수의 기능을 담아 이름 지음(getNumber)
- 기능 : getNumber 키보드로부터 정수를 입력받아서 반환하는 함수
- 매개변수: 고ㅏ목명
- 리턴값(리턴자료형): int
getScore() 메서드로 국어/영어/수학 점수 출력 받기
어떻게 "국어 점수를 입력하세요" "영어 점수를 입력하세요" "수학 점수를 입력하세요" 를
만들까?
모 르 겠 음 ㅠㅠ
int kor, eng, mat, tot;
double avg;
kor = getScore("국어"); //만들고 오른쪽 파랑버튼 누르면 바로 이동
eng = getScore("영어");
mat = getScore("수학");
tot = kor + eng + mat;
avg = (double) tot /3;
System.out.println(">국어: " +kor ) ;
System.out.println(">영어: " +eng );
System.out.println(">수학: " +mat );
System.out.println(">총계: " +tot );
System.out.println(">평균: " +avg );
//국어 점수 키보드로 입력받아 반환하는 함수 선언
}
// String 클래스 matches() 함수 찾기 (api docu 홈)
// matches(String regex)
// : Tells whether or not this string matches the given regular expression.
private static int getScore(String subjectName) {
Scanner scanner = new Scanner(System.in);
System.out.printf("> %s 점수를 입력하세요: ",subjectName);
//유효성 검사가 필요(100점 넘어도 계산 그냥 되니까)(0<=정수<=100)
return scanner.nextInt();
String 클래스 matches() 함수 찾기 (api docu 홈)
matches(String regex)
: Tells whether or not this string matches the given regular expression.

or 연산자 주목
X? 연산자(물음표 반복기호)
regex 정규표현식
더 공부필요,,,
아침 7번 문제 풀이
한 문자를 입력받아서 소문자,대문자,한글, 숫자인지,특수문자인지 출력
특수문자: #$@! 이렇게만 상정하겠음
- 한 문자를 저장할 변수(one) 선언
- 스캐너 선언 (scanner)
- 스캐너의 next() 혹은 nextLine()으로 첫 문자 가져오기
package days06_night;
import java.util.Scanner;
public class Ex04 {
public static void main(String[] args) {
// 아침 7번 문제 풀이
// 1. 한 문자를 저장할 변수(one) 선언
// 2. 스캐너 선언 (scanner)
// 3. 스캐너의 next() 혹은 nextLine()으로 첫 문자 가져오기
char one;
Scanner scanner = new Scanner(System.in);
System.out.print("한 문자를 입력하세요: ");
// String data = scanner.nextLine();
// one = data.charAt(0);
one = scanner.next().charAt(0);
if ('A' <= one && one <='Z') {
System.out.printf("%c는 대문자입니다.", one);
} else if('a' <= one && one <='z'){
System.out.printf("%c는 소문자입니다.", one);
} else if('가' <= one && one <='힣'){
System.out.printf("%c는 한글입니다.", one);
} else if('1' <= one && one <='9'){
System.out.printf("%c는 숫자입니다.", one);
} else if(one=='#'|| one=='$'||one=='$'||one=='@'){
System.out.printf("%c는 특수문자입니다.", one);
} else {
System.out.println("본 문자는 설명될 수 없습니다.");
}
}//main
}//class
아스키코드 10개씩 출력하고, 5행마다 질문 후 실행처리
package days06_night;
import java.io.IOException;
public class Ex05 {
public static void main(String[] args) throws IOException {
//256자를 프린트하되, 10개마다 한 행을 나누고,
//5줄이 쌓일 때마다 더 실행하시겠습니까? 묻고 엔터쳐야 이후 진행
for (int i = 0; i < 256; i++) {
System.out.printf("[%c]", (char)i);
if (i%10 == 9) System.out.println();
if (i%50 == 49) pause();
}
}//main
private static void pause() throws IOException {
System.out.println(">더 실행하려면 아무 키나 누르세요. ");
//문자치고 엔터쳐도 되고 엔터(13번,10번)만 쳐도 무방
System.in.read();
System.in.skip(System.in.available());
}
}//class
lineNumber;
1행 : 09 개행19 개행
2행: 10
3행: 20~29