String 값 비교와 주소 비교

  1. String은 ==을 쓰면 주소를 비교함, 자바에서 ==는 주소 비교를 뜻하기 떄문임
  2. Heap에는 String constant pool이라는 곳이 있음 = shared memory
  3. 새로운 String 변수에 값을 넣으면 shared memory에서 같은 값이 있는지 확인하고, 있다면 그 값을 공유함
  4. stack에 있는 변수에는 값의 주소가 저장됨

 

new String

  1. new String은 데이터를 저장할 때, Heap에 instance를 만듦
  2. instance에 값의 주소를 저장하고, stack에 있는 변수에는 instance의 주소를 저장시킴

 

▽ 예제 코드 1 ▽

		int n1 = 1;
		int n2 = 1;
		
		String a = "A";
		String b = "A";
		String c = new String("A");
		String d = new String("A");
		
		// String은 ==을 쓰면 주소를 비교함
		System.out.println("[정수 비교]");
		System.out.println(n1 == n2); // 값이 같아서 true
		
		System.out.println("[String 주소 비교]");
		System.out.println(a == b); // 값이 아니라 주소값이 같아서 true
		System.out.println(b == c); // 주소값이 달라서 false
		System.out.println(c == b); // 주소값이 달라서 false
		
		System.out.println("[String 값 비교]");
		System.out.println(a.contentEquals(b));
		System.out.println(b.contentEquals(c));
		System.out.println(c.contentEquals(d));

 

 

 

 

문자열 입력(Scanner sc = new Scanner(System.in))

  • Java.lang.*에 속해 있지 않기 때문에 따로 import 해 줘야 함
  • Buffer로부터 데이터를 한 줄 '문자열' 형태로 가져옴(String 형)

 

 

반복문의 조건

  • 초기 + 조건 + 증감
  • while: 사용자가 원하는 만큼 명령을 여러 번 실행하는 제어 구조, 특정 조건이 만족되는 동안 명령 계속 실행
  • for: 초기 + 조건 + 증감을 한 번에 선언 가능
  • 흐름 제어
    1. break: 가장 근접한 루프 탈출
    2. continue: 반복 처리 중단하고 시작 위치로 이동

 

 

제어문

  • 순차적인 흐름을 조건에 따라 통제하는 명령
  • 사용자의 요구에 따라 프로그램이 동작함

If-else

  • 가정과 결과에 따라 행위를 결정하는 제어문

 

[2와 5는 건너뛰고 8에서 break]

int i;
		
for(i = 1 ; i <= 10 ; i++) {
			
	if(i == 2 || i == 5) continue;
	System.out.println("i = " + i);
	if(i == 8) break;
			
}

 

 

 

outer, inner

  • 지역이 이중으로 되어 있을 때, 바깥은 outer, 안은 inner로 표시
  • Break할 때 어느 label을 탈출할지 label할 때 쓰임

 

 

 

 

 

프로그램 처리 방식

  1. 일괄 처리 방식(Batch Program): 실행 한 번으로 모든 코드를 처리해 버리는 프로그램
  2. 대화형 프로그램: 한 줄씩 입력받아 실행하는 프로그램

예외 처리, 예외 전가

 

  1. 예외 상황 확률이 높을 때도 실행이 안 되기 때문에 예외 처리(try catch) 또는 전가(throws Exceptions)해 줘야 함
  2. 예외 처리
    • 실행 전에 에러가 뜨지 않지만 실행되면 컴파일 오류가 남
    • try: 예외가 발생할 것으로 예상되는 코드
    • catch: try에서 예외가 발생했을 때 catch 부분으로 감
    • e.printStackTrace()
      • try에서 생긴 에러의 원인을 출력
      • 개발 단계에서 인지하지 못한 에러의 원인을 알아내기 위해 가급적 catch 부분에 항상 넣어 주는 게 좋음

 

  1. 로직 에러(Logical Error
    • 사용자에게 에러가 노출되지 않으며 컴파일 에러도 나지 않음
    • 실행 시, 의도했던 것과 다르게 결과 값이 다르며 논리적으로 생기는 예외

 

 

[형 변환]

 

Data Type Promotion 자동 형 변환

  1. 작은 자료형 값을 큰 자료형에 넣을 때 자동으로 형 변환이 일어남
  2. 실수형은 무조건 정수형보다 큼

 

Data Type Casting 강제 형 변환

  1. 큰 자료형 값을 작은 자료형에 넣을 때는 Casting 해 줘야 함
  2. 데이터 손실 일어남
  3. char형은 음수를 포함하지 않기 때문에 int와 short보다 범위가 크거나 작다고 할 수 없음

예제 코드 1 ▽

    1 	byte b = 10;
    2 	short s = 20;
    3 	char c = 'A';
    4 	int i;
    5 	float f;
    6 	long l = 100L;
    7 			
    8 	s = b;
    9 	c = (char) b;
   10 	s = (short) c;
   11 	c = (char) s;
   12 	i = 100;
   13 	l = 500; // 자동 Promotion
   14 	f = l; // 실수형은 무조건 정수형보다 크기 때문에 에러 X
   15 	f = 5.11f;
   16 			
   17 	double d;
   18 	
   19 	d = 400f; // 자동 Promotion

예제 코드 2

 

[결과]

결과 : 1020

결과 : 30

결과 : 103.14

결과 : 13.14

결과 : 3.14A

결과 : 68.14

결과 : AB

결과 : 131 -> char는 사실상 정수이기 때문에 정수처럼 계산됨

결과 : ? -> 131에 해당하는 ASCII 코드가 '?'임

    1 	int i1 = 10;
    2 	int i2 = 20;
    3 	float f1 = 3.14f;
    4 	char c1 = 'A';
    5 	char c2 = 'B';
    6 			
    7 	System.out.println("결과 : " + i1 + i2);
    8 	System.out.println("결과 : " + (i1 + i2));
    9 	System.out.println("결과 : " + i1 + f1);
   10 	System.out.println("결과 : " + (i1 + f1));
   11 	System.out.println("결과 : " + f1 + c1);
   12 	System.out.println("결과 : " + (f1 + c1));
   13 	System.out.println("결과 : " + c1 + c2);
   14 	System.out.println("결과 : " + (c1 + c2));
   15 	System.out.println("결과 : " + (char)(c1 + c2));

 

 

 

 

[상수, Literal 상수]

  1. 변수 안에 literal 상수(기본 숫자)를 넣을 수 있음
  2. 그 변수가 final이면 그 변수는 상수가 됨
  3. final 선언 이후, 값 변경 불가능함

▽ 예제 코드 3 

    1 	int i = 100;
    2 	long l = 100L;
    3 	final byte ON = 1;
    4 			
    5 	// Literal : 100, 100L, 1
    6 	// 변수 : i, l
    7 	// 상수 : ON

 

 

 

 

[논리 연산자]

  1. Short-cut 연산이 적용됨
  2. 앞 조건이 거짓이면, 뒤 조건은 보지 않고 넘어감

 

[기본 입출력]

 

System.in.read()

  1. 입력받기 전에 Buffer에 남아 있는 입력을 확인하고 가져옴
  2. 없다면 문자 하나를 입력받음
  3. 문자를 입력하면 int 값으로 전환되어서 저장됨
  4. 사용자가 입력하면 입력된 문자와 함께 \r, \n도 Buffer에 들어감
  5. 다음 입력을 받을 때, 비워 줘야 함

▽ 예제 코드 3 

    1 	int a = System.in.read();
    2 	System.out.println("입력하신 문자는 " + (char) a + "입니다.");
    3 	// casting 해 줘야 함

 

 

 

[절차 지향과 객체 지향의 차이]

 

절차 지향

  1. 코드를 작성한 순서대로 실행함
  2. 뭔가를 만들 때 처음부터 끝까지 다시 만들어야 함
  3. 만들어야 하는 프로그램에 대한 지식이 있어야 함

객체 지향

  1. 조립식: 이미 작성되어 있는 코드들을 필요하면 가져와서 코드를 하나로 만들 수 있음
  2. Java는 Interface를 활용한 모듈화 코딩

[JAVA의 구성 요소 - JRE와 JDK의 차이]

 

JRE

  1. 자바 실행 환경 설정(Java Runtime Environment)
  2. 해당하는 운영체제에 맞는 JRE를 다운받으면 다른 운영체제에서 작성된 코드도 실행할 수 있음(Write once, Run anywhere)

JDK

  1. 자바 개발 도구(Java Development Kit)
  2. 개발에 필요한 실행 파일을 가짐

[컴퓨터의 구성 요소]

 

CPU: 중앙 처리 장치

RAM: 주기억 장치

SSD: 보조 기억 장치

컴퓨터가 동작하는 순서: 입력 -> 기억 -> 연산

  1. CPU가 프로그램을 실행하기 위해서는 데이터를 사용해야 함
  2. 사용하기 전에 데이터를 기억해 놔야 하는데, 그 기억해 놓는 장치를 기억 장치라고 함
  3. RAM은 실행할 때 필요한 데이터를 CPU에게 넘겨 줌
  4. RAM의 크기가 클수록 한 번에 처리할 수 있는 데이터 양이 많지기 때문에 성능이 좋음
  5. RAM은 SSD에서 데이터를 복사해 오고, SSD의 속도가 빠를수록 컴퓨터의 성능이 좋음
  6. RAM: Stack + Heap + data + text

 

 

+ Recent posts