TIL

TIL_20220830

번잔중 2022. 8. 30. 21:19

오늘 할 일

🫧 코드스테이츠 8일차

  • 자바 이론
  • 변수와 타입
  • 문자열
  • 스터디 규칙 정하기(놀랍지만 내가 조장ㅋ)

오늘 배운 것

⛳️ Java | Day 1

TMI 시간. 자바를 왜 배워야 할까요? 그냥 많이 쓰니까? NO, 물론 저도 그런줄 알았음ㅋ. 진짜 이유는 객체지향 프로그래밍 언어로 운영체제에 독립적으로 실행이 가능하기 때문에 다양한 운영체제가 공존하는 웹 환경에 적합해서 입니다.!
역시 세상 모든 일에는 이유가 있습니다. ㅎㅎ

Java Intro

JVM(Java Virtual Machine)

자바는 컴파일러를 거쳐서 기계어로 변환되는 언어이다. 컴파일러는 JVM이 자바 언어를 이해할 수 있도록 바이트코드로 변환해주고, JVM은 바이트코드를 운영체제에 맞는 기계어로 변환한다.

 

  • 소스코드 - 컴파일러 - 바이트코드 - JVM - 운영체제s의 흐름으로 볼 수 있다.
  • JVM에서 운영체제에 맞는 기계어로 변환해주기 때문에 자바 언어가 운영체제에 독립적일 수 있는 것이다.

 

JDK(Java Development Kit)

자바 프로그램을 개발할 것이라면 JDK를 설치해야 한다.

 

  • JRE(Jave Runtime Environment): JVM + 표준 클래스 라이브러리
  • JDK(Java Development Kit): JRE + 개발에 필요한 도구

 

public class Main { ... }

접근 허용 범위가 public인 Main이라는 이름의 클래스를 정의한다.

 

public static void main(String[] args) { … }

간단하게 표현하면 A main(B C) { D }로 나타낼 수 있다. 이 내용은 메서드를 정의하는 문법이다.

 

  • 메서드란, ‘어떤 기능을 수행하기 위한 코드들을 묶어놓은 것’이며, 여기에서 ‘어떤 기능을 수행한다’는 것은 데이터를 입력받아 입력 받은 데이터에 일련의 처리를 가한 후, 그 결과값을 반환하는 것을 의미한다.
  • 여기서 반환은 메서드 내부 코드가 만들어낸 결과값을 내보낸다는 의미이다.
  • 객체 지향 언어인 자바에서는 함수보다는 메서드라는 용어를 사용한다.

 

/* 메서드의 형태 */
A main(B C) {
	D
}

/* 각 요소 설명 */
반환_타입 메서드_이름(매개변수_타입 매개변수_이름) {
	메서드_바디
}

 

A는

  • 반환 타입
  • 반환 타입은 메서드가 반환할 반환 값의 종류 및 유형을 의미하며 메서드를 정의할 때 메서드 이름 앞에 반환 타입을 명시해주어야 한다.

 

B, C는

  • B: 매개변수의 타입, C: 매개변수의 이름
  • 매개변수는 메서드 외부에서 메서드 내부로 전달한 값을 할당받아 저장함으로써, 메서드 내부에서 사용할 수 있게 한다.
  • 매개변수의 타입은 어떤 유형의 값을 메서드가 입력받을 것인지를 명시하는 것을 의미하며, 매개변수의 이름은 입력받은 값에 어떤 이름을 붙여 사용할 것인지를 명시하는 것을 의미한다.

 

D는

  • 메서드 바디
  • 구체적으로 메서드가 어떤 기능을 수행할지에 대한 코드를 작성하는 부분이다.
  • return 키워드를 사용해 값을 반환한다.

 

예시)

/* 정수형 메서드 add는 2개의 정수형 매개변수 number1과 number2를 가지고 number1 + number2 
연산의 결과값을 반환한다. */
int add(int number1, int number2) {
	return number1 + number2;
}

 

메서드 호출

메서드를 실행시키려면 메서드를 아래처럼 호출을 해주어야 한다.
/* add 메서드에 매개변수 1과 2를 입력하여 호출한다. */
add(1, 2);

 

main 메서드

자바에서 main 메서드는 *진입점 함수이며, 자바로 어떤 소스 코드를 작성할 때 반드시 main 메서드가 있어야 하고, main 메서드로부터 코드의 흐름이 시작된다.

*프로그램이 실행될 때, 가장 먼저 실행되는 메서드 또는 함수를 진입점 함수라고 한다.

 

의사 코드 - 슈도코드(pseudo code)

의사 코드(슈도코드)는 우리가 앞으로 배울 프로그래밍 언어로 코드를 작성하기 전에, 무엇을 어떤 과정을 통해 만들지 사람의 언어로 먼저 작성하는 것이다.

변수(Varialbe)과 타입(Type)

컴퓨터는 메모리에 어떤 값을 저장할 때 아래의 과정을 통해 값을 저장한다.

1. 기억하고자 하는 값이 얼만큼의 메모리 공간을 필요로 하는지 파악한다.
2. 기억하고자 하는 값이 차지하는 용량만큼의 메모리 공간을 확보한다.
3. 확보한 메모리 공간에 기억하고자 하는 값을 저장한다.
4. 값을 저장한 공간에 이름을 붙인다.

 

위의 과정에서 1~3번이 중요하다.

  • 1번: 어떤 값을 기억하기 전에 그 값을 저장하기 위해 필요한 메모리 공간의 크기를 알아야 한다. 이를 위해 필요한 것이 타입이다. 타입, 또는 데이터 타입은 데이터의 유형을 의미하며, 데이터의 유형별로 차지하는 메모리 공간의 크기가 각각 다르다.
  • 2, 3번 : 어떤 값을 메모리에 저장한 다음, 해당 값에 접근할 수 있으려면 값을 저장한 곳에 이름이 있어야 한다. 그래야 그 이름을 통해서 값에 접근할 수 있기 때문이다. 이처럼, 어떤 값을 저장하고 나서 해당 값에 접근할 수 있도록 값이 저장된 메모리 공간에 사람이 지은 이름을 붙인 것을 변수라고 한다.

변수

값을 저장할 수 있는 메모리 공간에 사람이 식별할 수 있는 이름을 붙인 것을 말한다.
  • 메모리에 값을 저장하기 위해서는 메모리 주소가 필요하다. 하지만 메모리 주소에 직접 접근하는 것은 위험하고 어떤 데이터인지 식별하는 데에 어려움을 겪는다.
  • 이 문제를 해결해주는 것이 변수이다.

 

변수의 선언과 할당

변수 선언

  • 변수를 선언할 때에는 저장하고자 하는 값의 데이터 타입과 함께 변수 이름을 작성한다. 변수를 선언하면 컴퓨터는 타입에 따라 값을 저장할 메모리 공간을 확보하고, 이 공간에 사용자가 입력한 변수 이름을 붙인다.
  • 변수를 선언한다는 것은 어떤 값을 저장할 메모리 공간을 확보하고, 해당 메모리 공간을 식별할 수 있는 이름을 붙이는 것을 의미한다.

 

값 할당

  • 변수에 값을 저장하는 것을 할당 또는 대입이라고 한다.
  • 변수를 선언하고 나서 처음으로 값을 할당하는 것을 초기화 라고 한다.
  • 초기화가 이루어진 후에 다시 다른 값을 할당하는 것을 재할당이라고 한다.

 

변수 명명 규칙

자바에서 변수명은 일반적으로 카멜 케이스(camelCase)를 사용한다. 카멜케이스란 낙타 등 모양을 닮았다고 해서 붙여진 이름으로, 두 번째 단어부터 대문자로 시작해 구분한다.

변수명은 사용 목적에 맞게 작명하는 것이 중요하다. 잘 동작한다고 해서 반드시 잘 짠 코드라고 할 수는 없다. 좋은 코드는 잘 동작할 뿐만 아니라, 사람에게도 잘 읽히는 코드를 의미한다.

 

상수

상수는 간단히 말해, 재할당이 금지된 변수이다. 즉, 변수와 같이 선언하고 할당하여 사용할 수 있지만, 재할당이 금지되어져 있다. 상수는
final이라는 키워드를 사용해 선언할 수 있으며, 관례적으로 대문자에 언더바(_)를 넣어 구분하는 SCREAMING_SNAKE_CASE를 사용한다.

 

상수를 사용하는 이유

  • 프로그램이 실행되면서 값이 변하면 안되는 경우
    • 프로그래머가 실수로 상수에 값을 재할당하고자 하면 에러가 발생하여 실수를 방지할 수 있다.
  • 코드 가독성을 높이고 싶은 경우
    • 상수를 사용하면 값을 저장하고 있는 상수명으로 값을 사용할 수 있기 때문에 코드 가독성이 향상된다.
  • 코드 유지관리를 손쉽게 하고자 하는 경우
    • 여러분들이 계산기 프로그램을 만들었으며, 소스 코드에서 원주율이 필요한 곳에 모두 숫자값 3.14를 그대로 사용했다고 가정해보자. 만약, 여러분이 계산의 정밀도를 높이기 위해 원주율을 3.14159로 변경해야 한다면, 기존의 3.14가 사용된 모든 코드를 찾아 일일이 수정해주어야 한다. 반면, 상수를 사용하면 상수에 할당할 값만 3.14159로 바꾸어주면 된다.

 

타입

타입은 어떤 값의 유형 및 종류를 의미하며, 타입에 따라 값이 차지하는 메모리 공간의 크기와, 값이 저장되는 방식이 결정된다. 자바의 타입은 실제 값을 의미하는 기본 타입(primitive type)과 어떤 값이 저장된 주소를 값으로 갖는 참조 타입(reference type), 두 가지의 데이터 타입을 가지고 있다.
  • 기본 타입(primitive type)
    • 값을 저장할 때, 데이터의 실제 값이 저장된다.
    • 정수 타입(byte, short, int, long), 실수 타입(float, double), 문자 타입(char), 논리 타입(boolean)
  • 참조 타입(reference type)
    • 값을 저장할 때, 데이터가 저장된 곳을 나타내는 주소값이 저장된다.
    • 객체의 주소를 저장, 8개의 기본형을 제외한 나머지 타

 

리터럴

사전적으로 리터럴(Literal)은 ‘문자 그대로의'라는 뜻을 가진다. 프로그래밍에서 리터럴이란 문자가 가리키는 값 그 자체를 의미한다.

 

리터럴을 사용할 때 알아두어야 하는 사항

  1. float 타입의 변수에 실수형 리터럴을 할당할 때, 리터럴 뒤에 접미사 f를 붙여주어야 한다.
  2. long 타입의 변수에 정수형 리터럴을 할당할 때, 리터럴 뒤에 접미사 L을 붙여주어야 한다.
    • 소문자 l을 붙여도 되지만, 숫자와의 혼동을 방지하기 위해 보통 대문자 L을 사용한다.

 

정수 타입

정수 타입은 숫자를 나타내는 타입으로, byte, short, int, long의 총 4개의 타입으로 분류된다. 이들은 각각 차지하는 메모리의 크기가 다르며, 그에 따라 나타낼 수 있는 숫자의 범위가 다르다.
타입 메모리 표현 범위
byte 1byte -128(-2^7) ~ 127(2^7 - 1)
short 2byte -32,768(-2^15) ~ 32,767(2^15 - 1)
int 4byte -2,147,483,648(-2^31) ~ 2,147,483,647(2^31 - 1)
long 8byte -9,223,372,036,854,775,808(-2^63) ~ 9,223,372,036,854,775,807(2^63 - 1)

 

정수형의 오버플로우와 언더플로우

  • 오버플로우
    • 자료형이 표현할 수 있는 범위 중 최대값 이상의 값을 표현한 경우 발생
    • 최대값을 넘어가면 해당 데이터 타입의 최소값으로 값이 순환한다.
  • 언더플로우
    • 자료형이 표현할 수 있는 범위 중 최소값 이하의 값을 표현한 경우 발생
    • 최소값을 넘어가면 해당 데이터 타입의 최대값으로 값이 순환한다.

 

실수 타입

실수는 소수점을 가지는 값을 의미하며, float형과 double형으로 분류된다.

  • double형 리터럴에는 접미사 d를 붙여도, 붙이지 않아도 되지만, float형 리터럴에는 반드시 접미사 f를 붙여주어야 한다.
  • double형은 float형보다
    1. 더 큰 실수를 저장할 수 있다.
    2. 더 정확하게 저장할 수 있다.

 

실수형의 오버플로우와 언더플로우

  • 오버플로우
    • 값이 음의 최소 범위 또는 양의 최대 범위를 넘어갔을 때 발생하며, 이 때 값은 무한대(-3.4 * 10^38 또는 3.4 * 10^38을 벗어난 범위)
  • 언더플로우
    • 값이 음의 최대 범위 또는 양의 최소 범위를 넘어갔을 때 발생하며, 이 때 값은 0(-1.4 * 10^-45 ~ 1.4 * 10^-45)

 

논리 타입

논리 타입의 종류는 boolean형 한가지 뿐이다. boolean형은 참 또는 거짓을 저장할 수 있는 데이터 타입으로, 오직 true
혹은 false를 값으로 가진다. 1btye 크기를 갖는다.

 

문자 타입

문자 타입은 2byte 크기의 char형 오직 하나만 있다. 문자 타입 변수를 선언하면 해당 변수에 오직 하나의 문자형 리터럴을 저장할 수 있다. 문자형 리터럴을 작성할 때에는 반드시 작은 따옴표(’ ’))를 사용하여야 한다. 큰 따옴표를 사용한 리터럴은 문자형 리터럴이 아니라 문자열 리터럴로 인식되기 때문이다.
  • 자바는 유니코드로 문자를 저장한다.
  • 숫자를 문자형 변수에 할당할수도 있다. 변수의 값을 읽어올 때 해당 변수가 저장하고 있는 숫자값을 유니코드로 인식하여 해당 숫자와 일치하는 코드를 가진 문자로 변환한다.

 

타입 변환

1. 자동 타입 변환

아래 두 경우에는 타입이 자동으로 변환

 

  1. 바이트 크기가 작은 타입에서 큰 타입으로 변환할 때 (예 : byte → int)
  2. 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때 (예 : 정수 → 실수)
// 화살표를 기준으로 좌측의 타입이 우측의 타입으로 자동으로 변환될 수 있음을 의미
// 각각의 타입 옆의 소괄호에 타입이 가지는 크기
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)

 

2. 수동 타입 변환

차지하는 메모리 용량이 더 큰 타입에서 작은 타입으로는 자동으로 타입이 변환되지 않는다. 이때 더 큰 데이터 타입을 작은 데이터 타입의 변수에 저장하기 위해서는 수동으로 타입을 변환해주어야만 한다. 이를 캐스팅(casting)이라고 한다.

다양한 메서드

Java int to string

String.valueOf(): String의 메서드
Integer.toString(): Integer의 메서드
String.format()

 

Java string to int

Integer.parseInt(): Integer의 메서드
Integer.valueOf(): Integer 객체

 

Java char to int

char - '0'
Character.getNumericValue(input.charAt(i))

 

Java int to char

(char)
Character.forDigit()
Integer.toString()

 

Java math

// 반올림
Math.round
// 반내림
Math.floor
// 올림
Math.ceil
// 절댓값
Math.abs
// 큰 값 혹은 작은 값
Math.max Math.min
// 제곱
Math.pow
// 제곱근
Math.sqrt

문자열(String)

String이란?

자바는 String 클래스 타입을 사용해서 문자열을 다룬다. 간단하게 설명하자면 클래스는 그 자체로 타입으로 사용될 수 있으며, 연관된 기능들을 묶을 수 있다.

 

String 타입의 변수 선언과 할당

기본적으로 String 타입은 큰따옴표("")로 감싸진 문자열을 의미한다.
  • 선언한 변수에 문자열을 할당하는 방법은 두 가지가 있다.
    1. 문자열 리터럴을 할당하는 방법 : 변수 = “문자열”;
    2. String 클래스의 인스턴스를 생성하여 할당하는 방법 : 변수 = new String(”문자열”);
  • 위의 두 가지 방법 모두 문자열의 내용을 값으로 가지고 있는 것이 아니라, 문자열이 존재하는 메모리 공간 상의 주소값을 저장하고 있다.
  • 등가 비교 연산자: 좌항 == 우항의 형태로 사용할 수 있으며, 좌항의 값과 우항의 값이 일치하는지 검사하여 일치하면 true를, 일치하지 않으면 false를 반환한다. 양쪽의 항에는 변수 또는 값 등이 위치할 수 있다.
  • equals() 메서드: .앞의 변수가 저장하고 있는 문자열의 내용과 () 안의 문자열의 내용이 같은지 비교하여 같으면 true를 다르면 false를 반환해준다.

 

String 클래스의 메서드

1. charAt() 메서드

해당 문자열의 특정 인덱스에 해당하는 문자를 반환한다. 만약 해당 문자열의 길이보다 큰 인덱스나 음수를 전달하면, 오류가 발생한다.

 

2. compareTo() 메서드

해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교한다. 이 메서드는 문자열을 비교할 때 대소문자를 구분하여 비교한다. 만약 두 문자열이 같다면 0을 반환하며, 해당 문자열이 인수로 전달된 문자열보다 작으면 음수를, 크면 양수를 반환한다. 

만약 문자열을 비교할 때 대소문자를 구분하지 않기를 원한다면, compareToIgnoreCase() 메서드를 사용하면 된다.

 

3. concat() 메서드

해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환한다. 만약 인수로 전달된 문자열의 길이가 0이면, 해당 문자열을 그대로 반환한다.

 

4. indexOf() 메서드

해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환한다. 만약 해당 문자열에 전달된 문자나 문자열이 포함되어 있지 않으면 -1을 반환한다.

 

5. trim() 메서드

해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자를 제거해 준다.

 

6. toLowerCase()와 toUpperCase() 메서드

toLowerCase() 메서드는 해당 문자열의 모든 문자를 소문자로 변환시켜 준다. 또한, toUpperCase()
메서드는 해당 문자열의 모든 문자를 대문자로 변환시켜 준다.

참고 자료 - String 클래스의 문자열 조작 메서드 설명, 다른 것들도 있다!

 

Understanding toString() method - javatpoint

If you want to represent any object as a string, toString() method comes into existence. The toString() method returns the string representation of the object. If you print any object, java compiler internally invokes the toString() method on the object. S

www.javatpoint.com

 

연산자

산술 연산자

산술 연산자는 사칙연산에 사용되는 연산자(+, -, *,  /)와 나머지 연산자(%)를 포함한다.

 

연산자 기능 예시(int) 결과값

연산자 기능 예시(int) 결과값
+ (덧셈) 두 항의 값을 더한 값을 반환 7 + 3 10
- (뺄셈) 좌항의 값에서 우항의 값을 뺀 값을 반환 7 - 3 4
* (곱셈) 두 항의 값을 곱한 값을 반환 7 * 3 21
/ (나눗셈) 좌항을 우항으로 나눈 값을 반환 7 / 3 2
% (나머지 or 모둘러) 좌항의 값을 우항의 값으로 나눈 나머지를 반환 7 % 3 1

 

  • 나눗셈 연산자와 나머지 연산자를 사용할 때에는 우항에 0이 위치할 수 없다. 즉, 어떤 수를 0으로 나눌 수 없다.
  • 좌항이나 우항 중 하나라도 실수 타입의 값이 존재한다면, 실수 타입이 아닌 값도 실수 타입으로 자동으로 형변환되어 계산되며, 결과적으로 실수 간의 나눗셈 연산이 되어 소수점이 버려지지 않은 온전한 값이 결과값으로 반환된다.

 

비교 연산자

비교 연산자는 boolean 타입으로 평가될 수 있는 조건식에 사용되며, 크게 대소 비교(>, <, <=, >=)연산자와 등가 비교(==, !=) 연산자로 분류된다.

 

대소 비교 연산자

대소 비교 연산자는 boolean을 제외한 나머지 기본 타입에 모두 사용할 수 있다.

 

비교 연산자를 사용할 때 주의할 점은, 이항 비교만 가능하다는 것이다. 즉 “x가 1보다 크고 5보다 작다”를 표현할 때, 1 < x < 5가 아니라, 1 < x && x < 5와 같이 논리 연산자를 사용해 작성해주어야 한다.

 

대소 비교 연산자 결과

대소 비교 연산자 결과
5 > 3 true
5 ≤ 5 true
3 > 2 true
2 ≥ 3 false

 

등가 비교 연산자

등가 비교 연산자는 모든 타입에 사용할 수 있는 연산자로, 두 항의 값이 동등한지의 여부를 판단할 때 사용한다.

다만, 기본 타입과 참조 타입 간에는 등가 비교 연산자를 사용할 수 없다. 즉, 기본 타입의 값끼리, 혹은 참조 타입의 값끼리만 등가 비교 연산자를 사용할 수 있다.

 

등가 비교 연산자는 값이 동등하면 true를, 그렇지 않으면 false를 반환한다.

 

등가 비교 연산자 결과

등가 비교 연산자 결과
5 == 3 false
5 == 5 true
3 ≠ 2 true
3 ≠ 3 false

 

논리 연산자

논리 연산자는 AND 연산자 &&, OR 연산자 ||, NOT 연산자 !를 포함하며, 공통적으로 boolean 타입을 반환한다.

 

 연산자 우선순위

우선순위 연산자 내용
1 (), [] 괄호 / 대괄호
2 !, ~, ++, -- 부정/ 증감 연산자
3 *, /, % 곱셈 / 나눗셈 연산자
4 <, ≤, >, ≥ 대소 비교 연산자
5 && AND 연산자
6 || OR 연산자
7 ? : 조건 연산자
8 =, +=, -=, /=, %= 대입/할당 연산자

 

콘솔 입출력(I/O)

콘솔 출력

프로그래밍을 하면서 변수에 담긴 값을 확인해야 할 필요가 있을 때, 콘솔에 출력할 수 있다.

 

1. 출력하기 : System.out.print()

소괄호 안의 내용을 단순히 출력하기만 하고, 줄바꿈을 하지 않는다.

 

2. 출력하고 줄 바꾸기 : System.out.println()

소괄호 안의 내용을 콘솔에 출력하고 줄바꿈을 한다. print 뒤에 붙은 ln은 line을 의미한다.

 

3. 형식대로 출력하기 System.out.printf()

지시자(specifier, 형식 지정자)를 이용해 변수의 값을 여러 형식으로 출력해주는 메서드이다. 지시자는 이름 그대로 값을 어떤 형식으로 출력할 것인지를 지정하기 위해 사용한다. f는 formatted의 약자이다

 포맷

지시자  출력 포맷
%b 불리언
%d 10진수
%o 8진수
%x, %X 16진수
%c 문자
%s 문자열
%n 줄바꿈

 

콘솔 입력

데이터를 입력받는 코드
// 데이터를 입력받는 기능을 작은 프로그램으로 만든 것
import java.util.Scanner;

// Scanner 클래스
Scanner scanner = new Scanner(System.in);

// 입력 받기
String inputValue = scanner.nextLine();

// 정수형을 입력받을 수 있는 nextInt(), 실수형을 입력받을 수 있는 nextFloat()등의 메서드들도 존재한다.

느낀점

  • 오랜만에 자바를 공부했는데, 공부할 양이 생각보다 엄청 많았다. 예전에 학교 수업에서 들었던 것들도 생각나기도 했다.
  • 코드스테이츠 교육은 디테일하지 않으면서 핵심을 잘 설명해준다. 혼자 할 때라면 모든 것을 다 알고 코드를 작성하려고 했겠지만 이 많은 양을 다 숙지한 상태로 코딩을 한다는 것은 넌센스라고 생각한다.
  •  예전과는 프로그래밍을 대하는 나의 모습이 점점 바뀌고 있다. 자잘한 것들을 알고 시작해야 한다는 이상한 강박으로 시작도 못하던 내가 진도를 다 나가지 못한 경우에도 일단 구글에 알음알음 찾아가며 문제를 풀고 있다. 힘들지만 즐겁다.

내일 할 일

🛎 코드스테이츠 9일차

  • 조건문
  • 반복문
  • 알고리즘 이야기
  • break와 continue