CHAPTER 2: Introductory JAVA Language Features

권휘우·2024년 10월 12일

중간고사 총정리

목록 보기
4/5

Packages and Classes

package: 비슷한 카테고리의 클래스끼리 그룹화해둔 것

  • java.lang 이라는 패키지 안에는 일반적으로 자주 사용되는 클래스들이 포함되어 있다. 그리고 이 패키지는 자동으로 자바 프로그램에 제공이 된다. 만약 다른 패키지의 클래스를 불러와서 사용하려면 import packagename.* 또는 import packagename.ClassName;이라는 import statement가 필요하다.

  • package 아래에는 subpackage라는 계급도 존재한다. 따라서
    import packagename.subpackagename.ClassName 등의 import statement도 존재를 한다.
    ex)import java.util.*

  • 보시다시피 packagename은 소문자로 작성되므로 주의하자.

static은 main method에서 class를 만들지 않고도 실행할 수 있게 만들어주는 접근제어자다. 즉 모든 main method는 static.


Types and Identifiers

identifier: user가 naming할 수 있는 것

  • 변수, 인자, 상수, 클래스, 메서드 등의 이름을 말한다.
  • 그 대상에 따라 작성법이 다르다. 대표적으로 class는 대문자로 시작한다.

Primitive Data Type

  • built-in type이라고도 불리며, 8개 존재한다.
  • 고정된 메모리 범위를 가지고 있어, 이를 초과하면, overflow가 일어난다.
  • 선언(declaration)초기화(initialization)가 필요하다. 그 시점을 잘 알아놓자.

예시 코드

int x; //x declarated
double y,z; //y and z declarated

x = 15; //x initialized to 15

double p = 2.3; //p declarated $ initialized to 2.3

이외에도 integer랑 부동소수점 실수들이 메모리에 어떻게 저장되는지 교재에 나와있으나, 이 부분에 수업 전 내용에서 다뤘으므로 넘어간다.

Casting

Primitive data type들은 서로 다른 type으로 변환될 수 있다.

  1. Explicit Casting(명시적 형변환): 키워드를 통해 직접 형을 변환하는 것. 값이 달라질 수 있으므로 사용할 때 주의해야 함.
  2. Implicit Casting(묵시적 형변환): 별도의 명령 없이 자동으로 형이 변환되는 것. 연산자에 의해 일어난다(대입 연산자, 산술 연산자 등).

예시 코드

int total, n;
double average;

average = (double)total/n; //total이 먼저 explicit casting 되고, n이 implicit casting된다.
--
double cost = 10.7;
int num = (int) cost; //double을 int로 explicit casting하여 값이 짤린다.

Hexadecimal and Octal Numbers

  • Hexadecimal number: 16진수
  • Octal number: 8진수
  • binary number: 2진수

교재에서는 이 셋 간의 변환을 가르치고 있는데 별로 안 중요하니까 넘어가라. 나와도 쉽게 할 수 있을 듯.

Final Variables

  • final이라는 키워드를 통해 변수를 상수로 바꿔 사용할 수 있다.
  • final은 class에도 사용할 수 있으며, 그 class는 하위 클래스가 없게 된다.

예시 코드

final int CLASS_SIZE = 35;
final double TAX_RATE = 0.08;

Operators

핵심: operator precedence(우선순위)

Arithmetic Operator(산술연산자): +, -, *, /, %

Realtional Operator(비교연산자): ==, !=, <, >, <=, >=

Logical Operator(논리 연산자): !, &&, ||

Assignment Operator(대입 연산자): =, +=, -=, *=, /=, %=

Increment/Decrement Operator(증감연산자): ++, --

*삼항/비트/시프트 연산자는 교재에 없다.

  • ++는 산술연산자보다 훨씬 빨리 작동한다.
  • =는 굉장히 stirct하다. floating point number에서 생기는 매우 작은 오차까지 검사한다.
  • 따라서 floating point number를 비교할 떄는 x-y <= emax(x,y) 방법을 사용한다.
  • &&와 ||에서는 왼쪽 값에 따라 오른쪽 값을 보지 않아도 결과가 나오는 경우가 있다. 따라서 효율성에 따라 오른쪽 조건을 실행하지 않을 때도 있는데, 이를 short-circuit evaluation이라고 한다.
  • increment, decrement -> 후위 , 전위에 따라 의미가 달라진다.
    ex)
		int a=2;
		System.out.println(a++); //실행하고 나서 더한다 -> 2
		System.out.println(++a); -> 3

Input/Output

Input

  • 실행 중 입력하는 세가지 방법: args, class, GUI
  • 앞에서 다뤘다.
  • class로 나온다면 IO.readLine(), IO.readDouble() 이런 식으로 나올 테니 알아둘 것.

Output

System.out.println();
  • System은 static한 클래스.
  • System.out은 System class에 속한 static object. (정확히는 다른 것 같은데 좀 어려운 개념인 듯) 화면에 출력값이 표시되게 함.
  • print는 System.out의 method다!
  • char, int/double 은 물론 boolean도 출력.

Escape Sequences

\n: 줄바꿈
\": 큰따옴표 자체를 출력
\: \ 자체를 출력

예시 코드

System.out.println("He is known as \"furrygay\".");
//output: He is known as "furrygay".

System.out.println("I'm goint to cut th\nis.")
//output: I'm going to cut th
//		  is.

Control Structures

  • Selection statement = Decision-making Structure: 조건문
    if, if else, nested if(중첩문), switch

  • Iterative statement: 반복문
    for, for-each, while, do while

Selection Statement

1. if statement

//if statement
if (a==3)
{
	System.out.println("홍제시발");
}

//if...else statement
if (true)
{
	System.out.println("시발앱컴");
}
else
{
	System.out.println("사실백점맞음");
}

//nested if
if (앱컴싫어 == true)
	if(일물싫어 == true)
    	System.out.println("휴학");
  • 주의할 점: if는 가장 가까운 else와 짝을 짓는다. if를 중첩해서 사용할 때 이를 간과한다면 다음과 같은 오류를 범할 수 있다:
int a=3;

if (a>0)
	if(a>4) System.out.println("꺼져 홍제야");
else System.out.println("사랑해 홍제야");

//기댓값: 아무것도 출력되지 않음
//현실: 사랑해 홍제야
  • elseif(a>0)와 짝지을 줄 알았으나 if(a>4)와 연결되어 생기는 일이다. 사실 우리가 코드를 작성할 때는 {}를 쓰니까 그럴 일이 없긴 한데... 문제는 시험에 이런 식으로 함정이 나올 수도 있으므로 꼭 알아놓자.

2. switch statement

  • 교재에는 안 나오지만 그래서 더 중요하다. if문이랑 바꾸는 법을 꼭 알자.

  • 작년 기출에서는 조건을 if문 조건을 a>5같이 줘놓고 switch문으로 바꾸라는 문제가 있었다. 조건설정이 한정적인 switch문이므로 헷갈릴 수 있으나, 이건 casting 등을 이용하여 어떻게든 끼워맞출 수 있다. 당황하지 말자.

int a=4;

switch(a){
	default:
		System.out.print("흑흑");
	case 3:
		System.out.print("ㅅ비ㅏㄹ");
	case 2:
		System.out.print("개시발");
		break;
    case 1:
		System.out.print("조같은 련아");
}

//output: 흑흑ㅅ비ㅏㄹ개시발
  • case는 엄밀히 따지면 실행할 코드를 조건으로써 보호하는 역할이라기보다는 조건이 맞는 자리로 호출하는 역할인 것 같다. 즉 break;를 만나지 않는 이상 코드는 계속해서 아래로 내려가며 코드들을 실행시킨다.

  • 따라서, 위아래 코드 순서를 적당히 조절하면, 이런 부분들까지 활용할 수 있다.(정보 보안 등급이라던가...)

  • break가 끝까지 없으면 그냥 끝까지 실행하고 switch문을 나간다.

  • defualt는 if문의 else같은 친구다. 조건에 안 맞는 경우들을 모두 호출하는데 없다고 문제가 생기는 건 아니고 그냥 바로 switch문을 나간다.

  • 반복문에서는 break와 continue 모두 쓰이나 여기서 continue 썼다가는 에러가 난다.

  • a에는 int를 넣어야 하는데, 사실 char도 된다. 실수형 넣으려고 하면 역정을 낸다.


Iterative statement

1. for loop

for (initialization ; termination condition ; update statement)
{
	/* body */
}
  • 실행 순서는 initialization -> termination condition -> body -> update statement

  • 종료 조건이 첫번째 실행 전부터 성립하면 그건 그냥 아무것도 실행하지 않을 뿐이다. 에러가 아니다.

  • 모든 for문은 while문으로 변환이 가능하다!

  • break와 continue는 얘를 비롯한 반복문에서 알차게 사용된다. continue는 진행 중인 루프를 나가 다음 루프를 진행하는 것이고, break;는 반복문 전체를 벗어나는 것이다.

  • exit 조건이 비어있거나 true로 채워지면 무한반복.


2. while loop

while (boolean test)
{
	/* loop body */
}
  • 실행 순서는 boolean test -> loop body

  • for문에서 변환했을 때, initialization은 반복문 전에, update statement는 loop boy 끄트머리에 있게 된다.

  • 만약 loop body에서 조건문이 false가 될 수 없는 코드가 적혀있다면 해당 반복문은 무한으로 반복하게 된다..
    특히 continue를 잘못 써서 update statement에 도달하기 전에 다음 루프로 넘어가버린다면, 계속해서 같은 값으로 반복문을 맴돌게 될 것이다.

  • true를 쓰면 무한반복. 비워져있으면 에러다.

do{
	/* loop body */
} while (boolean test)
  • 변형격인 do-while문의 경우 순서가 반대로 되어 loop body -> boolean test 순으로 실행된다. 즉 body가 무조건 한 번은 실행된다.

sentinal

//Enter list of positive integers, end with SENTINAL
final int SENTINAL = -999;
while (value != SENTINAL){
	value=IO.readInt();
}
  • 보통 유저가 입력하지 않을 만한 값을 종료 조건으로 사용하는 반복문 활용

3. for-each loop

for (int element : a)
{
	/*loop body*/
}
  • a에는 ArrayList 등 CFC가 들어가면 된다. a는 그 식별자.
  • 순차적으로 element를 copy한다. 따라서 a에는 아무 영향도 가지 않는다.

int[] d = new int[]{1,2,3};
for (int b : d)
{
	System.out.print (b);
}
//output: 123
//d의 값들을 b에 순차적으로 복사


int[][] a = new int[][]{{1,2,3}, {2,3,4}};
for (int[] b : a){
	System.out.println(b+);
	for (int c : b)
		System.out.println(c);
}
//output: [I@7adf9f5f 123 [I@372f7a8d 234
//즉 b에는 각 주소가 카피된다. c에는 b에 카피된 1차원 배열의 값들이 카피된다.
//4바이트(32bit, 16진수 8자리)의 주솟값이 복사된다.
}

element에 대입될 때 묵시적 형변환이 가능하다.


Errors and Exceptions

크게 두가지가 존재한다.

  1. compile time error(= syntax error)
  2. runtime error = logical error = bug : 원하는 결과가 나오지 않는 것
  • 버그는 자바에서 제공하는 debugger를 사용하여 해결하거나, exception으로 핸들링한다.

  • 모든 error는 exception으로 핸들링한다.(뭔 소린지 모르겠다만 그렇게 필기되어 있음.)

  • throw를 통해 exception을 지정할 수가 있다.

예시 코드

if (numScores == 0)
	throw new ArithmeticException("Cannot divide by zero");
else
    findAverageScore();

시험 포인트

  • 쌤이 확실한 게 언급하신 건 operator precedence 정도.
  • 각 type마다 어느 정도 allocation 되는 지 확실하게 외워야 한다.
  • 새로 배운 제어문들은 다 공부해놓자 제발...
  • 기존 제어문들도 어떻게 바꾸는지 알아야 한다. (if - while)
  • Casting 개념은 정확히 잡아놓기.
  • fileinput/fileoutput에서 file.close()가 있는지 보자.
profile
서울대갈거임

0개의 댓글