오늘은 개발과 커밋 자세히보기

프로그래밍 공부/Java

[ Java 프로그래밍 ] 공부 정리 - 2강. 자바 기본 프로그래밍

호크테마 2023. 4. 30. 14:10

* 공부 정리일자 (2022년 8~12월) 
- 책 : 명품 자바 에센셜 
- 개인적으로 공부 및 복습하면서 정리한 내용입니다. (사진 제외) 


* 목차
2강. 자바 기본 프로그래밍 (책 50p) 
2.1 자바 프로그램의 구조 (책 50p)
2.2 식별자 (책 53p)
2.3 자바의 데이터 타입 (책 54p)
2.4 자바의 키 입력 (책 62p)
2.5 연산자 (책 66p)
2.6 조건문 (책 76p)  


1. 복습 (중요 키워드 위주)
2장 – 자바 기본 프로그래밍 (책 50p)
2.1) 자바 프로그램의 구조

* 예제 2-1 : Hello, 자바 프로그램의 기본 구조

(1) 클래스 만들기
- Hello 이름의 클래스 선언

- class 키워드로 클래스 선언
- public으로 선언하면 다른 클래스에서 접근 가능
- 클래스 코드는 { } 내에 모두 작성

(2) 주석문
- // 한 라인 주석
- /* 여러 행 주석 */

(3) main() 메소드
- 자바 프로그램은 main()에서 실행 시작

- public static void으로 선언
- String[] args로 실행 인자를 전달 받음

(4) 메소드
- C/C++에서의 함수를 메소드로 지칭
- 클래스 바깥에 작성할 수 없음

(5) 메소드 호출
- sum() 메소드 호춯

- sum() 호출 시 변수 i의 값과 정수 10을 전달
- sum()의 n, m에 각각 20, 10 값 전달
- sum()은 n과 m 값을 더한 30 리턴
- 변수 s는 정수 30을 전달받음

(6) 변수 선언
- 변수 타입과 변수 이름 선언
- 메소드 내에서 선언된 변수는 지역 변수
-- 지역 변수는 메소드 실행이 끝나면 저장 공간 반환

(7) 문장
- ; 로 한 문장의 끝을 인식
|
(8) 화면 출력
- 표준 출력 스트림에 메시지 출력
- 표준 출력 스트림 System.out의 println() 메소드 호출
- println()은 여러 타입의 데이터 출력 가능
- println()은 출력 후 다음 행으로 커서 이동


2.2) 식별자 (identifier) (책 53p)

* 식별자란?
- 클래스, 변수, 상수, 메소드 등에 붙이는 이름

* 식별자의 원칙
- ‘@’, ‘#’, ‘!’와 같은 특수 문자, 공백 또는 탭은 식별자로 사용할 수 없으나 ‘_’, ‘$’는 사용 가능
- 유니코드 문자 사용 가능. 한글 사용 가능
- 자바 언어의 키워드는 식별자로 사용불가
- 식별자의 첫 번째 문자로 숫자는 사용불가
- ‘_’ 또는 ‘$’를 식별자 첫 번째 문자로 사용할 수 있으나 일반적으로 잘 사용하지 않는다.
- 불린 리터럴 (true, false)과 널 리터럴(null)은 식별자로 사용불가
- 길이 제한 없음

* 대소문자 구별
- int barChart; 와 int barchart; 는 서로 다른 식별자 선언

* 사용 가능한 예
* 잘못된 예


2.3) 자바의 데이터 타입 (책 54p)

(1) 자바의 데이터 타입
* 기본 타입 : 8 개
- boolean, char, byte, short, int, long, float, double

* 레퍼런스 타입 : 1 개이며 용도는 다음 3 가지
- 클래스(class)에 대한 레퍼런스
- 인터페이스(interface)에 대한 레퍼런스
- 배열(array)에 대한 레퍼런스

(2) 자바의 기본 타입
* 특징
- 기본 타입의 크기는 CPU나 운영체제에 따라 변하지 않음

(3) 문자열
* 문자열은 기본 타입이 아님

* String 클래스로 문자열 표현
- 문자열 리터럴 – “JDK”, “한글”, “계속하세요”
- 문자열이 섞인 + 연산 -> 문자열 연결

(4) 변수와 선언
* 변수
- 프로그램 실행 중에 값을 임시 저장하기 위한 공간
-- 변수 값은 프로그램 수행 중 변경될 수 있음

* 변수 선언
- 데이터 타입에서 정한 크기의 메모리 할당

(5) 리터럴 (literal)
(5.1) 리터럴
* 프로그램에서 직접 표현한 값
* 정수, 실수, 문자, 논리, 문자열 리터럴 있음

(5.2) 정수 리터럴
* 10진수, 8진수, 16진수, 2진수 리터럴

* 정수 리터럴은 int 형으로 컴파일
* long 타입 리터럴은 숫자 뒤에 L 또는 l을 붙여 표시
- ex) long g = 24L;

(5.3) 실수 리터럴
* 소수점 형태나 지수 형태로 표현한 실수
- 12. 12.0 .1234 0.1234 1234E-4

* 실수 타입 리터럴은 double 타입으로 컴파일
* 숫자 뒤에 f(float)나 d(double)을 명시적으로 붙이기도 함

(5.4) 문자 리터럴
* 단일 인용부호(' ')로 문자 표현
- 'a', 'W', '가', '*', '3', '7‘, ‘글’
- \u다음에 4자리 16진수로, 2 바이트의 유니코드(Unicode)

* 특수문자 리터럴은 백슬래시(\)로 시작

(5.5) 논리 타입 리터럴
* 논리 값 표시
- true 또는 false 뿐
- boolean 타입 변수에 치환하거나 조건문에 이용

(5.6) 기본 타입 이외 리터럴 
* null 리터럴
- 레퍼런스에 대입 사용

* 문자열 리터럴 (스트링 리터럴)
- 이중 인용부호로 묶어 표현
-- "Good", "Morning", "자바", "3.19", "26", "a"

- 문자열 리터럴은 String 객체로 자동 처리

(6) 상수 
* 상수 선언
- final 키워드 사용
- 선언 시 초깃값 지정
- 실행 중 값 변경 불가

* 상수 선언 사례

(7) var 키워드 
* 기존의 변수 선언 방식 : 변수의 타입 반드시 지정

* var 키워드 (Java 10부터 도입)
- 타입을 생략하고 변수 선언 가능
- 컴파일러가 추론하여 변수 타입 결정

* 변수 선언 시 초깃값이 주어지지 않으면 컴파일 오류
* var는 지역 변수 선언에만 한정

* 예제 2-2 : var 키워드를 사용하여 변수 선언
* 예제 2-3 : 변수, 리터럴, 상수 사용하기
- 원의 면적을 계산하여 출력하는 프로그램을 작성하라.

(8) 타입 변환
* 타입 변환
- 한 타입의 값을 다른 타입의 값으로 변환

(8.1) 자동 타입 변환
- 컴파일러에 의해 원래의 타입보다 큰 타입으로 자동 변환
- 치환문(=)이나 수식 내에서 타입이 일치하지 않을 때

(8.2) 강제 타입 변환
* 강제 타입 변환
- 개발자의 의도적 타입 변환
- () 안에 개발자가 명시적으로 타입 변환 지정

* 강제 변환은 값 손실 우려


* 예제 2-4 : 타입 변환
- 자동 타입 변환과 강제 타입 변환이 들어 있는 코드이다. 실행 결과는 무엇인가?


2.4) 자바의 키 입력 (책 62p)
(1) System.in
- 키보드와 연결된 자바의 표준 입력 스트림
- 입력되는 키를 바이트(문자 아님)로 리턴하는 저수준 스트림
- System.in을 직접 사용하면 바이트를 문자나 숫자로 변환하는 많은 어려움 있음

(2) Scanner 클래스
* 읽은 바이트를 문자, 정수, 실수, 불린, 문자열 등 다양한 타입으로 변환하여 리턴
- java.util.Scanner

* Scanner 객체 생성 (import 문 필요) 
- 키보드에 연결된 System.in에게 키를 읽게 하고, 원하는 타입으로 변환하여 리턴

* Scanner에서 키 입력 받기
- Scanner는 입력되는 키 값을 공백으로 구분되는 토큰 단위로 읽음
- 공백 문자 :‘\t’,‘ \f’,‘ \r’,‘ ’,‘ \n’

* 개발자가 원하는 타입 값으로 쉽게 읽을 수 있음

* Scanner 주요 메소드

* 예제 2-5 : Scanner를 이용한 키 입력 연습
- Scanner를 이용하여 이름, 도시, 나이, 체중, 독신 여부를 입력 받고 / 다시 출력하는 프로그램을 작성하라.


2.5) 연산자 (책 66p)
(1) 식과 연산자
* 연산
- 주어진 식을 계산하여 결과를 얻어내는 과정

(2) 산술 연산자
* 더하기(+), 빼기(-), 곱하기(*), 나누기(/), 나머지(%)

* /와 % 응용
- 10의 자리와 1의 자리 분리
- x가 홀수인지 판단
- n의 값이 3의 배수인지 확인

* 예제 2-6 : /와 % 산술 연산자 응용
- 초 단위의 정수를 입력 받고, 몇 시간, 몇 분, 몇 초인지 구하여 출력하는 프로그램을 작성하라.

(3) 증감 연산
* 1 증가 혹은 감소 시키는 연산
* ++, --

(4) 대입 연산
* 연산의 오른쪽 결과는 왼쪽 변수에 대입

* 예제 2-7 : 대입 연산자와 증감 연산자 사용하기
- 다음 코드의 실행 결과는 무엇인가?

(5) 비교 연산, 논리 연산
* 비교연산자 : 두 개의 값을 비교하여 true/false 결과
* 논리연산자 : 두 개의 논리 값에 논리 연산. 논리 결과

* 예제 2-8 : 비교 연산자와 논리 연산자 사용하기
- 다음 코드의 실행 결과는 무엇인가?

(6) 조건 연산
* 3 개의 피연산자로 구성된 삼항(ternary) 연산자
- opr1?opr2:opr3
- opr1이 true이면, 연산식의 결과는 opr2, false이면 opr3

* if-else을 조건연산자로 간결하게 표현 가능

* 예제 2-9 : 조건 연산자 사용하기
- 다음 코드의 실행 결과는 무엇인가?

(7) 비트 연산
* 비트 개념

* 비트 연산
- 비트 논리 연산
-- 비트끼리 AND, OR, XOR, NOT 연산

* 비트 시프트 연산
- 비트를 오른쪽이나 왼쪽으로 이동

* 피 연산자의 각 비트들을 대상으로 하는 연산 

* 비트 논리 연산 응용 (옵션)
- 냉장고에는 8개의 센서가 있고 
   이들은 flag 변수와 연결되어 있다고 할 때,
   냉장고의 온도가 0도 이상으로 올라가면 비트 3이 1이 되고,
   0도 이하이면 비트 3이 0을 유지한다.

- 문제) 현재 냉장고의 온도가 0도 이상인지 판단하는 코드는?

(8) 시프트 연산
* 예제 2-10 : 비트연산자와 시프트연산자 사용하기- 다음 코드의 실행 결과는 무엇인가?


2.6) 조건문 (책 76p) 
(1) 단순 if 문, if-else 문
* 단순 if 문
- if의 괄호 안에 조건식(논리형 변수나 논리 연산)
-- 실행문장이 단일 문장인 경우 둘러싸는 {, } 생략 가능

* if-else 문
- 조건식이 true면 실행문장1, false이면 실행문장2 실행 

* 예제 2-11 : if-else 사용하기 
- 나이를 입력 받아 20대인지 판별하는 프로그램을 작성하라

(2) 다중 if-else 문
* 다중 if문
- 조건문이 너무 많은 경우, switch 문 사용 권장  

* 예제 2-12 : 다중 if-else를 이용하여 학점 매기기
- 다중 if-else문을 이용하여 / 입력 받은 성적에 대해 학점을 부여하는 프로그램을 작성하라. 

* 중첩 if-else문, 예제 : 2-13 중첩 if-else문 사례
- if 문이나 else 문, 혹은 if-else 문에 if문이나 if-else문을 내포할 수 있다.
-- 점수와 학년을 입력 받아 60점 이상이면 합격, 아니면 불합격을 출력하라. 
-- 다만 4학년은 70점 이상이어야 합격이다. 60점 이상인 경우 4학년을 구분하여 처리해야 한다.

(3) switch문
* switch문은 식과 case 문의 값과 비교
- case의 비교 값과 일치하면 해당 case의 실행문장 수행 
-- break를 만나면 switch문을 벗어남

- case의 비교 값과 일치하는 것이 없으면 default 문 실행
- default문은 생략 가능

(3.1) switch문에서 break문의 역할
* switch문 내의 break문
- break문을 만나면 switch문 벗어남
- case 문에 break문이 없다면, 다음 case문으로 실행 계속
-- 언젠가 break를 만날 때까지 계속 내려 가면서 실행

(4) case 문의 값
- 문자, 정수, 문자열 리터럴(JDK 1.7부터)만 허용
- 실수 리터럴은 허용되지 않음

* 예제 2-14 : switch 문 사용하기
- 1~12 사이의 월을 입력 받아 봄, 여름, 가을, 겨울을 판단하여 출력하라.