Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Let's kick it

[혼공자]1주차 - chap01 ~ 03 본문

혼공학습단12기

[혼공자]1주차 - chap01 ~ 03

bloggerddori 2024. 7. 7. 23:51

새롭게 12기가 되었고 11기에 이어서 다시 할 수 있어서 너무 좋습니다! 자바와 자바스크립트 중에 고민을 했는데 자바는 계속 미뤄두기만 해서 이 기회에 시작해 보자 해서 신청하게 되었습니다.

혼공족장님이 공지페이지에서 말씀하신 내용 중에 불안을 느끼는 분들에게 인사이드 아웃 2를 추천하신다고 하셨는데(아직 저는 못 봤답니다) 그것에 덧붙여 불안한 감정을 태울만한 강력한 노래 하나 추천하고 갑니다. FT아일랜드 - Burn it 한 번 들어보세요!

1 장

자바 특징

  • 모든 체제에서 실행 가능
  • 객체 지향 프로그래밍(OOP : object - oriented programming) : 객체(부품)를 만들고, 이 객체들을 서로 연결해서 더 큰 프로그램을 완성하는 기법.
  • 메모리(RAM) 자동 정리. → 코드 작성에 집중할 수 있다
  • 무료 라이브러리 풍부 → 프로그램 개발 기간 단축 가능

- 기본 숙제 ( JDK 설치 화면 인증하기)

bin파일 : 개발할 때 사용되는 파일이며, javac.exe(자바 컴파일러)와 java.exe(자바 실행명령어)가 저장되어 있다.

bin 폴더 안의 명령어 중

  • javac 명령어 : 자바 소스 파일을 컴파일해 준다.
  • java 명령어 : javac 명령어와 컴파일된 파일을 실행해 준다.

이 명령어들은 명령 프롬프트의 명령 라인에서 개발자가 직접 컴파일하고 실행할 때 사용된다.

  • 환경변수 : 운영체제가 실행하는 프로그램에게 제공해 주는 정보.
  • path 환경변수는 실행 중인 프로그램이 어떤 파일을 찾을 때 이용하는 환경변수

path환경변수 편집 중에 & & 사이에 환경변수 이름을 넣어주면 환경변수가 가지고 있는 값이 원래 값 대신에 들어가게 된다는 뜻. 즉, 환경변수의 값을 사용한다는 의미. 이렇게 변경해 사용하는 이유는 나중에 JDK버전이 바뀌어서 JAVA_HOME이 변경되면 path 환경변수는 변경된 폴더를 그대로 적용해서 bin 폴더를 찾게끔 해준다.

Java perspective와 view설정

  • 프로젝트 생성 시, 자체 실행 프로그램을 만들어야 하기 때문에 module(모듈)이 아닌 일반 프로젝트로 생성한다. 물론 모듈 프로젝트도 실행은 할 수 있지만 목적이 다른 프로그램이 가져다 쓸 수 있는 라이브러리와 같은 그런 프로그램을 개발할 때 사용하기 때문에.
  • 해당 SelfStudy 폴더를 확장해 보면 src폴더는 보이지만 bin폴더는 보이지 않는다. 왜냐하면 개발할 때는 프로그램 소스 파일 위주로 개발을 하기 때문에 src폴더만 보여줌.
  • bin폴더는 내부적으로 폴더가 생성되고 거기에 자동적으로 바이트 코드 파일이 저장됨.
  • package는 자바 소스를 묶어주는 역할.
  • class의 첫 이름을 대문자로 하는 게 관례.
  • 바이트 코드 파일은 개발 완료된 자바 프로그램 형태이고, 바로 운영체제에서 실행되지 않는다. JVM(자바 가상 기계)라는 번역기가 필요하다. (java 명령어에 의해 구동)
  • 자바 소스 파일은 javac 명령어로 컴파일한 파일.

 

- 확인 문제 오답 모음

더보기

1 - 1 확인 문제

(2) JDK 설치 폴더 안의 bin 폴더를 path 환경 변수에 등록하는 이유는 무엇?

→ 2번(자동 업데이트를 하기 위해)을 고름 : 업데이트되면 이름이 바뀌어 변수로 사용하지 못하니까 자동 업데이트를 하기 위해서로 골랐는데

답은 3번(다른 경로에서  bin폴더 안에 있는 명령어를 사용할 수 있도록 하기 위해), 말 그대로 다른 경로에서 bin폴더 안에 있는 명령어를 사용하기 위해.

1 - 3 확인 문제

(4 - 4) 올바르게 작성된 소스파일을 저장하면 자동으로 컴파일하고, 바이트 코드 파일이 생성된다. (O)

→ x로 고른 이유 : 소스파일 저장 후 run을 돌려야 생성된다고 생각했음.

하지만 52p를 참고해 보면, 이클립스는 컴파일을 위한 메뉴가 따로 없고, 성공적으로 컴파일되면 자동 컴파일된 코드파일이 생성된다.


2 장

  • 자바의 변수는 다양한 타입의 값을 저장할 수 없다.
  • 정수 타입 변수에는 정수 값만 저장 가능하다.
  • 하나의 변수에 두 가지 값을 저장할 수 없고, 하나의 값만 저장 가능하다
  • 변수 선언은 저장되는 값의 종류와 이름만 언급한 것이다. 이름 그대로 선언만!
  • 변수에 최초로 값이 저장될 때 변수가 생성된다. 이것을 변수 초기화라 한다. 이때 사용된 값을 초기값이라 한다.
  • 변수가 초기화되면 메모리 번지 정보를 갖게 되고, 해당 메모리 번지에 값이 저장된다.
  • 초기화되지 않은 변수는 아직 메모리 번지 정보를 가지고 있지 않으므로 변수를 통해 메모리 값을 읽을 수 없다.
  • 메소드란 어떤 일을 처리하는 실행문들을 모아 놓은 블록을 말한다.

- 자바의 기본 타입

저장되는 값에 따른 분류 타입의 종류
정수 타입 byte, char, short, int, long
실수 타입 float, double
논리 타입 boolean

- 자바의 정수 타입

타입 메모리 사용 크기  저장되는 값의 허용 범위
byte 1byte 8bit -128 ~ 127
short 2byte 16bit -32,768 ~ 32,767
char 2byte 16bit 0 ~ 65535 (음수 값을 가질 수 x)
int 4byte 32bit -2,147,483,648 ~ 2,147,483,647
long 8byte 64bit -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

* 자바는 c와 달리 1byte가 8bit이다.

literal(리터럴) : 소스 코드에서 프로그래머에 의해 직접 입력된 값을 말함. 

기본적으로 컴파일러는 정수 리터럴을 int 타입으로 간주. long타입임을 알리기 위해서는 정수 리터럴 뒤에 소문자 l이나 대문자 L을 붙이면 되는데, 혼동되기 쉬운 소문자 대신 대문자를 사용한다. 하지만 정수 리터럴이 int 타입의 허용 범위 이내라면 L을 붙이지 않아도 된다.

escape(이스케이프) 문자 : 문자열 내부에 역슬래시(\)가 붙은 문자를 사용하는 것을 말한다. 이스케이프 문자를 사용하면 문자열 내부에 특정 문자를 포함시킬 수 있다. 또한 출력을 제어할 수 있다.

- 이스케이프 문자

이스케이프 문자 출력 용도
\t 탭만큼 띄움
\n 줄 바꿈(라인 피드)
\r 캐리지 리턴(커서 위치를 같은 줄 행의 맨 앞(왼쪽)으로 복귀시킴)
\" " 출력
\' ' 출력
\\ \ 출력
\u16진수 16진수 유니코드에 해당하는 문자 출력

- 실수 타입

타입 메모리 사용 크기 정밀도(소수점 이하 자리)
float 4byte 32bit 7자리
double 8byte 64bit 15자리

자바는 실수 리터럴을 기본적으로 double타입으로 해석한다. float 타입으로 저장하고 싶다면 리터럴 뒤에 f나 F를 붙여 컴파일러가 float 타입임을 알 수 있도록 해야 한다.

double은 float 타입보다 약 2배의 정밀도를 갖는다는 의미에서 붙여진 것이라 좀 더 정확한 데이터 저장이 가능하다.- 논리 타입참과 거짓을 의미하는 논리 리터럴로 true와 false를 사용한다. 1byte 크기의 boolean 타입 변수에 저장할 수 있다. boolean 타입 변수는 주로 두 가지 상태 값에 따라 조건문과 제어문의 실행 흐름을 변경하는 데 사용된다.

 타입 변환

타입 변환 : 데이터 타입을 다른 데이터 타입으로 변환하는 것.

자동 타입 변환(promotion) : 자동으로 타입 변환이 일어나는 것. 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생.

 - 기본 타입을 허용 범위 크기 순으로 정리
byte < short < char < int < long < float < double

정수 타입이 실수 타입으로 저장될 경우 무조건 자동 타입 변환된다. 실수 타입은 정수 타입보다 허용 범위가 크다. 

char 타입의 경우 int 타입으로 자동 타입 변환되면 유니코드 값이 int에 자동 저장된다.

자동 타입 변환의 예외) char 보다 작은 byte 타입은 char 타입으로 자동 변환되지 않는다. char 타입은 음수를 포함하지 않지만 byte 타입은 포함하기 때문이다. 

작은 타입 -> 큰 타입, 자동 변환 ㅇ

큰 타입 -> 작은 타입, 자동 변환되지 않아 강제 타입 변환을 사용해야 한다.

강제 타입 변환(casting) : 값의 허용 범위가 큰 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것. 캐스팅 연산자인 괄호( )를 사용하는데, 괄호 안에 들어가는 타입을 나누는 단위.

작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입 

실수 타입은 정수 타입으로 자동 변환되지 않는다. 그래서 강제 타입 변환을 사용해야 하는데, 이 경우 소수점은 버려지고, 정수 부분만 저장된다. 

- 정수 연산에서의 자동 타입 변환

정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산된다.

ex)

byte x = 10;
byte y = 20;
byte result = x + y; // 컴파일 에러
int result = x + y;

자바는 실행 성능 향상시키기 위해 컴파일 단계에서 연산을 수행할 수 있다.

byte result = 10 + 20;

이 경우 자바 컴파일러가 컴파일 단계에서 미리 연산해 값을 만들고, result 변수에 저장하도록 바이트 코드를 생성한다. 피연산자가 변수가 아니므로 int 타입으로 변환되지 않는다.

정수 연산식에서는 모든 변수가 int 타입으로 변환되는 것은 아니다. 두 피연산자 중 허용 범위가 큰 타입으로 변환되어 연산을 수행한다. 예를 들어 int 타입보다 허용 범위가 큰 long 타입이 피연산자로 사용되면 다른 피연산자는 무조건 long 타입으로 변환해 연산을 수행한다. 따라서 연산 결과를 long 타입 변수에 저장해야 한다.

- 실수 연산에서의 자동 타입 변환

정수와 마찬가지로 피연산자가 타입이 동일하다면 해당 타입으로 연산되지만, 피연산자 중 하나가 double이라면 double 타입으로 바뀌어(자동 타입 변환되어) 연산을 수행한다. 따라서 연산결과는 double 타입이 된다.

실수 리터럴 연산, 자바에서는 f나 F가 없는 실수 리터럴을 double로 해석하기 때문에 double 타입 변수에 저장해야 한다.

정수 타입의 연산은 정수 타입으로 연산되기 때문에 실수 타입으로 연산하고 싶다면 실수 연산으로 변경해야 한다. 둘 중 하나 또는 둘 모두를 double 타입으로 변환해야 한다. 

ex) (double) (x / y)로 잘못 수정하면 0.0을 얻는다. (x / y)가 먼저 연산되어 0이 되고, 여기서 (double) 0을 적용해 0.0 이 도기 때문이다.

+ 연산에서의 문자열 자동 타입 변환

자바에서의 + 연산자는 두 가지 기능을 가지고 있다. 피연산자가 모두 숫자일 경우 덧셈 연산을 수행하지만, 하나라도 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 수행한다.

숫자 + 숫자 -> 덧셈 연산 -> 숫자
"문자열" + 숫자 -> "문자열" + "숫자" -> 결합 연산 -> "문자열숫자"
숫자 + "문자열" -> "숫자" + "문자열" -> 결합 연산 -> "숫자문자열"

int x = 10 + 20 + 3; //33
String str = 10 + "20" + 3; 
//"10" + "20" + 3 -> "1020" + "3" -> 10203

연산식에서 + 연산자가 연이어 나오면 앞에서부터 순차적으로 + 연산을 수행하고, 그 덧셈 결과를 가지고 그다음 + 연산을 수행한다. 만약 먼저 수행된 연산이 결합 연산이라면 이후 +연산은 모두 결합 연산이 된다.

+ 연산을 순차적으로 수행하지 않고, 우선 연산하고 싶은 게 있다면 해당 부분을 괄호( )로 감싸주면 된다. 괄호는 최우선으로 연산을 수행한다.

- 문자열을 기본 타입으로 강제 타입 변환

변환 타입 변환하는 방법
String -> byte byte value = Byte.parseByte(str);
String -> short short value = Short.pareseShort(str);
String -> int int value = Integer.parseInt(str);
String -> long long value = Long.parseLong(str);
String -> float float value = Float.parseFloat(str);
String -> double double value = Double.parseDouble(str);
String -> boolean boolean value = Boolean.pareseBoolean(str);

문자열이 숫자가 아닌 알파벳이나 특수 문자, 한글 등을 포함하고 있을 경우 숫자 타입으로 변환을 시도하면 숫자 형식 예외(Number Format Exception)가 발생한다.

반대로 기본타입의 값을 문자열로 변경하는 경우도 있는데, 이 경우는 간단히 String.valueOf(기본타입값) 메소드를 이용하면 된다.

- 모니터로 변수값 출력하기

System. out. + println(리터럴 또는 변수);

System. -> 시스템이 가지고 있는

out. -> 출력 장치로

println(리터럴 또는 변수); -> 괄호 안의 내용을 출력하고 행을 바꿔라. println( )에서 ln은 line의 줄임말로 행을 바꾸라는 의미.

- 출력 장치 out의 메소드

메소드 의미
println(내용); 괄호 안의 내용을 출력하고 행을 바꿔라
print(내용); 괄호 안의 내용을 출력만 해라
printf("형식문자열", 값1, 값2, ...); 괄호 안의 첫 번째 문자열 형식대로 내용을 출력해라

printf( ) 메서드는 개발자가 원하는 형식화된 문자열(format string)을 출력할 수 있다. 예를 들어, 전체 출력 자릿수와 소수 자릿수를 제한할 수 있다. printf( ) 메소드의 괄호에는 다음과 같이 출력 형식 문자열과 제공될 값을 쉼표(,)로 구별해 나열해 주면 된다. printf("형식문자열", 값 1, 값 2, 값 3,...)"형식 문자열"에 들어갈 내용은 %[argument_index$] [flags] [width] [. precisim] conversion으로

argument_index$ : 값의 순번, 형식문자열에 포함될 값이 2개 이상일 경우 값의 순번을 알려줘야 함. ex) 1$는 첫 번째 값을,  2$ 두 번째 값을 뜻한다.

flags : 빈자리를 채우는 방법으로, 생략되면 공백으로 채워지고, -가 오면 오른쪽이 공백으로, 0이면 공백대신 0으로 채움.

width : 전체 자릿수

. precisim : 소수 자릿수

conversion : 변환문자, 변환문자인 conversion 빼고 생략 가능하다.

형식 문자열에서 &와 conversion(변환 문자)은 필수로 작성하고, 나머지들은 생략가능하다. %는 형식문자열의 시작을 뜻하고, conversion에는 제공되는 값의 타입에 따라 d(정수), f(실수), s(문자열)을 입력한다.

ex) System.out.printf("이름: %s", "혼공단");

- 키보드에서 입력된 내용을 변수에 저장하기

키보드에서 키 하나를 입력하면 프로그램에서는 숫자로 된 키코드를 읽을 수 있다. 키코드를 읽기 위해서는 System.in.read( )를 이용하면 된다. 

int keyCode = System.in.read();

보통 System.in.read( )로 읽은 키코드를 대입 연산자(=)를 사용해 int 변수에 저장한다. 변수에 저장된 값을 조사하면 입력된 키가 무엇인지 알 수 있다. 주요 키에 대한 키코드들에 대한 표는 115p 참고.

main() 메소드 끝에 throws Exception이 붙어 있는데 이것은 System.in.read( )에 대한 예외 처리 코드이다. 이것은 단순히 모니터에 예외 내용을 출력만 한다. 예외 처리란 예외가 발생했을 때 어떻게 처리할 것인지를 말한다.

System.in.read가 실행되면 이클립스의 console뷰는 enter 키가 입력될 때까지 대기 상태가 되고, enter 키가 입력되면 키코드를 하나씩 읽는다. 예를 들어 알파벳 A키를 입력하고, enter 키를 입력하면, System.in.read( )는 A에 대한 키코드를 먼저 읽고, enter 키에 대한 키코드를 읽는다. enter 키는 다른 키와 다르게 캐리지 리턴(CR: 13)과 라인피드(LF: 10)로 구성된 2개의 키코드가 입력된다. 따라서 2번에 걸쳐서 System.in.read( )로 읽어야 한다. 

System.in.read()의 단점은 키코드를 하나씩 읽기 때문에 2개 이상의 키가 조합된 한글을 읽을 수 있다. 그리고 키보드로부터 입력된 내요을 통문자열로 읽지 못한다. 이러한 단점을 보완한 Scanner 클래스를 Java는 제공한다.

Scanner scanner는 Scanner타입의 변수 scanner를 선언. new Scanner(System.in)은 시스템 장치로부터 읽는 Scanner를 생성하는 코드. 생성된 Scanner는 scanner 변수에 저장했다가 언제든지 키보드에서 읽고 싶을 때 Scanner.nextLine( ) 메소드를 실행하면 된다. Scanner.nextLine( )메소드는 enter키가 입력되기 전까지 대기 상태가 되고, enter키가 입력되면 입력된 모든 내용을 문자열로 읽는다.

import  java.util.Scanner는 import문이라고 하는데, Scanner가 java.util 패키지에 있다는 것은 컴파일러에게 알려주는 역할을 한다. 이 코드가 생략되면 Scanner를 찾을 수 없다는 컴파일 에러(Scanner cannot be resolved to a type)가 발생한다. System.in.read( )로 읽으면 int타입의 키코드를 얻고, scanner.nextLine( )으로 읽으면 String타입의 문자열을 얻는다. 자바는 기본 타입의 값이 동일한지 비교할 때는 ==를 사용하고, 문자열(String)이 동일한지 비교할 때에는 equals( )메소드를 이용한다.

 

- 확인 문제 오답 모음

더보기

2 - 1 확인 문제

(3) 컴파일 에러가 발생하는 코드를 찾고, 그 이유를 설명해 보세요

3번인 int score2;를 골랐다. score2에 값을 넣어주지 않아 변수 초기화가 되지 않아서 메모리를 가져올 수 없기 때문에 값을 부여해줘야 한다.라고 썼는데

4번 sum = score1 + score2; 이 정답이다. score2가 직접적으로 사용되는 라인이고, 변수 score2가 초기화되지 않았기 때문에 읽을 수 없기 때문이다

2 - 2 확인 문제

(2) 변수에 값을 저장하는 코드입니다. 맞는 것에 O, 틀리면 X 표시

2 -1. byte var = 200; -> (x), byte 허용범위가 127인데 넘어서 틀림.

2 -4. long var = 50000000000; ->(x), 컴파일러는 정수 리터럴을 int타입으로 간주, 소문자 l이나 대문자 L을 붙여야 함.

2 -7. String var = "나의 직업은 "개발자"입니다."; ->(x), 이스케이프 문자인 역슬래시(\)를 붙이지 않았음. (역슬래시가 있다고 생각하고 바로 동그라미 쳤음.)

2 -8. boolean var = 0; -> (x), 0, 1이 아닌 true, false 사용.

2 -10. float = 1e2f; -> (x), 이게 도대체 왜 틀렸을까 싶었는데 타입만 명시하고 변수 이름을 따로 선언해주지 않았다. 만약 변수 이름으로 사용했다더라도 예약어라서 사용하지 못한다.

2 - 3 확인 문제

(2) 강제 타입 변환에 대한 내용입니다. 컴파일 에러가 발생하는 것은 무엇입니까?

int intValue = 10;

char charValue = 'A';

double doubleValue = 5.7;

String strValue = "A";

-> 4번이 정답(char var = (char) strVaule;) , 문자열을 char 타입으로 강제 타입 변환(casting) 할 수 x.

하지만 나는 1번을 골랐다. 내가 제일 헷갈려하는 부분 중 하나로, 강제 타입 변환은 큰 거에서 작은 걸로 변환할 때 작은 게 큰걸 한 번에 담지 못해 자동 변환되지 않으니 나눠 담기 위해 강제 타입 변환하는 건데 작은 걸 큰 걸로 타입 변환해서 에러 발생했다고 적었음.

하지만 int 타입과 double 타입을 연산할 때, 먼저 int 타입의 피연산자가 double 타입으로 변환해야 하기 때문에 자동 변환되는데 이걸 ( )를 사용해 표현했다. 무조건 괄호를 사용하더라도 큰 거에서 작은 걸로 강제 타입 변환하지 않는다는 것에 유의하자. 

(5) 알파벳 a의 유니코드는 97이고, b의 유니코드는 98이다. 따라서 a의 유니코드에 1을 더하면 b의 유니코드가 되므로 다음과 같이 코드를 작성했다. 실행결과는 b가 출력되어야 하는데, 컴파일 에러가 발생했다. 무엇이 문제이고, 어떻게 수정하면 될까?

char c1 = 'a';

char c2 = c1 + 1;

System.out.println(c2);

문제를 제대로 읽자.

틀린 이유 : 연산의 결과는 int 타입인데, char 타입 변수 c2에 저장했기 때문에 에러가 발생했다.라고 작성했고, b가 출력되어야 하는데 98로 생각하고 문제를 풀었음. 

-> char c2 = (char) (c1 + 1); 이렇게 수정해야 한다.

실행결과는 b가 나와야 하니까 (char)를 사용해 타입 변환해야 한다.

(6) 자바에서 '/'는 나눗셈 연산자입니다. x / y는 x를 y로 나누는 연산을 수행합니다. 괄호에 들어갈 타입은 무엇이며, 출력되는 결과와 그 이유를 설명하기.

int x = 5;

int y = 2;

( ) result = x / y;

System.out.prinfln(result);

-> int, int 타입끼리는 타입 변환 x. / 틀린 이유 : double이라 생각함. 기본 실수 타입은 double이니까

(8) 두 실수를 덧셈 연산하고 소수점 이하 자리를 버리고 싶습니다. ( )에 들어갈 코드를 작성해 보라.

double var1 = 3.5;

double ver2 = 2.7;

int result = ( );

-> (int) (var1 + var2)이 정답.

- 추가 숙제 (p.110 (2-3) 확인 문제 9번에 들어갈 코드를 2가지 이상 작성해 보기

long var1 = 2L;
float var2 = 1.8f;
double var3 = 2.5;
String var4 = "3.9";

int result1 = (int)var1 + (int)(var2 + var3) + (int)Double.parseDouble(var4);
int result2 = (int)(var1 + var2 +var3 + (int)Double.parseDouble(var4));

system.out.println(result1);
system.out.println(result2);

int 타입 result 변수에 9가 저장되도록 코드 작성.

꽤나 어려웠던 문제였다. result1 결과만 작성하고 답지를 보고 다른 방법 예시를 이해하게 되었다.  문자열을 기본 타입으로 변환시켜 주고, 큰 타입을 작은 타입으로 사용하기 위해 강제 타입 변환을 사용하는데 괄호를 잘 사용해서 만들면 된다.

- 02 - 4 확인문제 코드로 작성

확인문제 1, 이름, 나이, 전화가 나오도록 출력

 

확인문제 2, 키보드로 입력한 두 수를 덧셈해 결과 출력

잘 돌아가지만 저렇게 노란 밑줄과 경고?( Resource leak: 'scanner' is never closed )가 떠서 찾아보니 코드에서 스캐너(Scanner)를 사용한 후에 스캐너를 닫지 않았을 때 발생하는데 스캐너는 파일이나 표준 입력에서 데이터를 읽을 때 사용되며, 사용이 끝나면 반드시 닫아야 합니다. 그렇지 않으면 리소스 누수(resource leak)가 발생하게 된다고 한다. 그래서 아래 코드와 같이 scanner.close()를 넣어주니 싹 사라졌다.

확인문제 3, 키보드에서 입력받고 출력하는 코드 작성

 


 

3장. 연산자

3 - 1 연산자와 연산식

  • 연산자(operator) : 연산에 사용되는 표시나 기호. ex) +, - , *, ==
  • 피연산자(operand) : 연산자와 함께 연산되는 데이터. ex) x, y, z 변수
  • 연산식(expression) : 계산식, 연산의 과정을 기술한 것.

우선순위는 단항> 이항> 삼항 순으로 높고, 산술>  비교>  논리> 대입 순으로 우선순위를 가진다.

진행 방향은 대체로 왼쪽 -> 오른쪽이지만 단항(증감, ~, !)., 부호, 대입 연산자오른쪽 -> 왼쪽으로 읽는다.

연산식은 반드시 하나의 값을 산출하며, 값 대신에 연산식을 사용할 수 있다.

 

3 - 2 연산자의 종류

연산자는 산출 방법에 따라 산술, 부호, 문자열, 대입, 증감, 비교 연산자로 구분하고, 피연산자 수에 따라 단항, 이항, 삼항 연산자로 구분된다.

 

- 단항 연산자

피연산자가 단 하나뿐인 연산자로, 부호 연산자(+,-), 증감 연산자(++,--), 논리 부정 연산자(!)가 있다. 

  • 부호 연산자

부호 연산자는 양수 및 음수를 표시하는 +, - 를 말하고, boolean 타입과 char 타입을 제외한 나머지 기본 타입에 사용한다.

+ 피연산자의 부호 유지
- 피연산자의 부호 변경

+, - 는 산술 연산자기이기도 하고, 부호 연산자이기도 한데, 부호 연산자로 쓰일 때는 하난의 피연산자만 필요하다.

부호 연산자는 일반적으로 정수 및 실수 리터럴 앞에 붙여 양수 및 음수를 표현한다. 정수 미 실수 타입 변수 앞에도 붙일 수 있는데 이때는 변수의 값을 유지하거나 변경하기 위해 사용된다.

- 연산자는 변수값의 부호를 양수는 음수로, 음수는 양수로 바꾼다.

주의할 점은 부호 연산자의 결과는 int 타입이라는 것!

ex) byte 타입 변수는 부호 연산하면 int 타입으로 변환된다.

 

  • 증감 연산자 (++, --)

변수의 값을 1 증가시키거나 감소시키는 연산자, boolean 타입을 제외한 모든 기본 타입의 피연산자에 사용 가능하다.

++(피연산자)  다른 연산을 수행하기 전 피연산자의 값 1 증가,감소
--(피연산자)
(피연산자) ++ 다른 연산을 수행한 후 피연산자의 값 증가, 감소
(피연산자) --

연산식에서 증감 연산자만 사용된다면 증감 연산자의 위치는 상관없다. 하지만 다른 연산자와 함께 사용된다면 증감 연산자의 위치에 따라 연산식의 결과가 다르게 나오므로 주의하자.

증감 연산자가 앞에 있으면 우선 변수값을 1 증가 또는 감소시킨 후에 다른 연산자를 처리하고, 증감 연산자가 변수 뒤에 있으면 다른 연산자를 먼저 연산 후 변수 변수 값을 1 증가 또는 감소 시킨다.

 

  •  

피연산자가 2개인 연산자, 산술 연산자(+, -, *, /, %), 문자열 결합 연산자(+), 비교 연산자(<, <=, >, >=, ==, !=), 논리 연산자(&&, ||, &, |, ^, !), 대입 연산자(=, +=, -=, *=, /=, %=)등이 있다.

산술 연산자

boolean 타입을 제외한 모든 기본 타입에 사용한다. 

산술 연산자의 특징은 피연산자들의 타입이 동일하지 않을 경우 규칙을 사용해 피연산자들의 차입을 일치 시킨 후 연산을 수행한다.

피연산자들이 byte, short, char 타입일 경우, 모두 int 타입으로 변환 후 연산 수행한다.

피연산자들이 모두 정수 타입이고 long 타입이 포함되어 있을 경우, 모두 long 타입으로 변환 후 연산 수행한다.

 


- tmi time

더보기

학습하기 위해 지나왔던 우여곡절 스토리. 당연히 e북으로 팔 거라 생각해 여유롭게 생각하고 있다가 7/1일 시작 당일에 없다는 걸 깨닫고 고민하기 시작. 구버전으로 하냐 개정판으로 하냐 고민하다가 기왕 할 거면 개정판이지 하고 구매하려는데 직접사냐 온라인 주문을 시키냐 편한 건 온라인이다 온라인 주문 ㄱ 하는데 분철을 해? 말아? 고민하니 혼공컴운 책이 약 500p인데 살짝쿵 불편했던 거 감안하면 이번엔 페이지가 더 많으니 무조건 분철이다 하고 주문 후 오매불망 기다리는데 너무 느리다 그래서 유튜브 강의로 일단 시작했다.

나는 c언어만 사용해 본 터라 클래스 추가 방식이 너무 신기했다. 그래도 정처기 준비할 때 java나 파이썬 문제 풀기 위해서 손코딩은 해봤지만 직접 코딩하는 건 다른 느낌이었고 새로워서 좋다.

- 1주 차 회고🍀

더보기

확인 문제를 너무 많이 틀려서 민망하고, 이해를 했다고 생각한 부분도 엄청 헷갈린다. 그리고 분량이 꽤나 많다. 별로 없네라고 호기롭게 시작했는데 노트에 옮긴 거 노션에 정리하고, 다시 티스토리에 옮기려니 괴롭다. 그리고 티스토리 글 쓰는 방식이 처음이라 그런가 되게 어렵다 ㅠㅋㅋㅋㅋ

 

(장마 기간이라 하늘에 구멍이 뚫린 것처럼 비가 내리는데 조심하세요 ☔🌧️ ~~ 하지만 빗소리 들으면서 공부하는 건 좋네요🙂‍↕️👍. )

 

'혼공학습단12기' 카테고리의 다른 글

[혼공자]6주차 - chap10  (0) 2024.08.15
[혼공자]5주차 - chap08  (0) 2024.08.05
[혼공자]4주차 - chap07  (0) 2024.07.28
[혼공자]3주차 - chap06  (0) 2024.07.21
[혼공자]2주차 - chap04  (0) 2024.07.13