[코드스테이츠] S1.Unit5 회고

JinYoung Choi·2022년 12월 26일
0

지금까지 배웠던 것들중 가장 길었던 Unit5 JAVA기초 파트가 끝이났다.
이 파트에서는 주로 개념에 대해 공부하고 코플릿으로 코딩을 해보는 시간을 갖는다. 코딩할땐 시간이 정말 빨리 간다.. 하루하루가 너무 빨라.. 또한 난이도가 올라가고 있다는것을 온몸으로 느끼고 있다. 점점 어려워져 ㅠㅠ

자바 파트로 들어온 첫날 같이 하시던 페어분께서 하차를 신청했다고 했다.
그렇게 짝을 잃어 버리고 낙동강 오리알이 되버린 나는 같은 그룹내 기존 그룹에 3인으로 들어가게 되었고, 새로운 활동을 시작하였다.
기존 그룹에서는 페어분이 전공자셔서 서로 코드를 리뷰하는 활동밖에 없었는데, 새로운 그룹에선 나말고 전부 비전공자분이셔서 나도 부족하지만 알려줄수 있는 부분에서는 최선을 다하여 알려주었다. 내 설명이 도움이 되었을땐 엄청 뿌듯하더라...
그렇게 페어 활동이 종료되었고 마무리로 딥토크 라는 그룹내 사람들끼리 서로를 알아가는 시간을 갖게 되었다. 비록 어색한 시간이였지만 다양한 분들이 여러 목적을 갖고 부트캠프를 지원하게 된점, 목표 등 알고 나니 큰 힘이 된 것 같다. 열심히 해야지!

JAVA

자바는 1996년 1월에 세상에 나온 객체지향 프로그래밍(Object Oriented Programming, OOP) 언어이며, 전자정부 프레임워크 등에 사용되면서 백엔드 개발 분야에서 가장 보편적으로 사용되고 있는 언어

자바의 특징

  • 운영체제에 독립적 - 자바 이전의 언어들은 특정 CPU에서만 작동하거나 특정 OS에 따라 다르게 작성해야 하는(C, C++) 언어들이 대부분, 자바는 이 문제를 해결하고자 JRE(Java Runtime Environment: JVM(자바 가상머신) + 표준 클래스 라이브러리)가 설치되어 있는 모든 운영체제에서 실행이 가능하도록 만들어졌다

  • 객체 지향 언어(Object Oriented Programming, OOP) - 유지보수가 쉽고 확장성이 높다

  • 함수형 프로그래밍 지원

  • 자동 메모리 관리(Garbage Collection) - 가비지 컬렉터(Garbage Collector)를 실행시켜 자동으로 사용하지 않는 메모리를 수거

JVM(Java Virtual Machine) - 자바 프로그램을 실행시키는 도구 , 자바가 운영체제에 독립적인 것은 JVM이 있기 때문에 가능
JVM은 자바 코드로 작성한 프로그램을 해석해 실행하는 별도의 프로그램입니다. 즉, 프로그램을 실행하는 프로그램.
JRE(Java Runtime Environment) : JVM + 표준 클래스 라이브러리
JDK(Java Development Kit) : JRE + 개발에 필요한 도구

주로 사용하는 자바버전 3가지 - JDK 8 , 11 , 17

변수

변수(Variable) : 값이 변할 수 있는 데이터를 임시적으로 저장하기 위한 수단

변수 선언 - 저장하고자 하는 값의 데이터 타입과 함께 변수 이름을 작성 ex) int num
값 할당 - 변수에 값을 저장하는 것을 할당 또는 대입 ex) num = 1
변수를 선언하면서 동시에 초기화 가능 ex) int num = 1

변수 명명 규칙

  • 변수명으로 영문자, 숫자, _, $를 사용할 수 있다
  • 영문자는 대소문자가 구별되어 인식
  • 숫자로 시작하는 변수명 사용 불가
  • 자바에서 이미 사용 중인 예약어는 변수명으로 사용 불가 ex) byte , class

상수

상수(Constant) : 변하지 말아야 할 데이터를 임시적으로 저장하기 위한 수단
상수는 final이라는 키워드를 사용해 선언할 수 있으며, 관례적으로 대문자에 언더바를 넣어 구분하는 SCREAMING_SNAKE_CASE를 사용 ex) final double CALCULATOR_PI = 3.14;

상수를 사용하는 이유

  • 프로그램이 실행되면서 값이 변하면 안되는 경우
  • 코드 가독성을 높이고 싶은 경우
  • 코드 유지관리를 손쉽게 하고자 하는 경우

타입

타입은 어떤 값의 유형 및 종류를 의미하며, 타입에 따라 값이 차지하는 메모리 공간의 크기와, 값이 저장되는 방식이 결정

  • 값이 차지하는 메모리 공간의 크기 - 정수형 타입의 데이터는 4byte, 문자형 타입의 데이터는 1byte
  • 값이 저장되는 방식 - 타입은 저장하고자 하는 값을 그대로 저장하는 기본타입과, 저장하고자 하는 값을 임의의 메모리 공간에 저장한 후, 그 메모리 공간의 주소를 저장하는 참조타입으로 분류

기본 타입(primitive type)

  • 값을 저장할 때, 데이터의 실제 값이 저장
  • 정수 타입(byte, short, int, long), 실수 타입(float, double), 문자 타입(char), 논리 타입(boolean)

참조 타입(reference type)

  • 값을 저장할 때, 데이터가 저장된 곳을 나타내는 주소값이 저장됩니다.
  • 객체의 주소를 저장, 8개의 기본형을 제외한 나머지 타입

리터럴

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

  • float 타입의 변수에 실수형 리터럴을 할당할 때, 리터럴 뒤에 접미사 f를 붙여주어야 한다
  • long 타입의 변수에 정수형 리터럴을 할당할 때, 리터럴 뒤에 접미사 L을 붙여주어야 한다

정수 타입

정수 타입은 숫자를 나타내는 타입으로, byte, short, int, long 의 총 4개의 타입으로 분류됩니다. 이들은 각각 차지하는 메모리의 크기가 다르며, 그에 따라 나타낼 수 있는 숫자의 범위가 다르다.

오버플로우

  • 자료형이 표현할 수 있는 범위 중 최대값 이상의 값을 표현한 경우 발생
  • 최대값을 넘어가면 해당 데이터 타입의 최소값으로 값이 순환
  • 예 : 어떤 값이 byte형이고, byte형의 최대값인 127을 값으로 가지는 경우, 이 값에 1을 더하면 128이 되는게 아니라, 최소값인 -128이 된다.

언더플로우

  • 자료형이 표현할 수 있는 범위 중 최소값 이하의 값을 표현한 경우 발생
  • 최소값을 넘어가면 해당 데이터 타입의 최대값으로 값이 순환
  • 예 : 어떤 값이 byte형이고, byte 형의 최소값인 -128을 값으로 가지는 경우, 이 값에 1을 빼면 -129가 되는게 아니라, 최대값인 127이 된다

실수 타입

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

오버플로우

  • 값이 음의 최소 범위 또는 양의 최대 범위를 넘어갔을 때 발생하며, 이 때 값은 무한대가 된다.

언더플로우

  • 값이 음의 최대 범위 또는 양의 최소 범위를 넘어갔을 때 발생하며, 이 때 값은 0이 된다.

논리 타입

논리 타입의 종류는 boolean형 한가지, boolean형은 참 또는 거짓을 저장할 수 있는 데이터 타입으로, 오직 true 혹은 false를 값으로 가진다.
단순히 참과 거짓을 표현하기 위해서는 1bit만 있으면 되지만, JVM이 다룰 수 있는 데이터의 최소 단위가 1byte이기 때문에 boolean형은 1byte(8bit)의 크기를 가진다.

문자 타입

문자 타입은 2byte 크기의 char형 오직 하나 , 문자형 리터럴을 작성할 때에는 반드시 큰 따옴표(””)가 아닌 작은 따옴표(’’)를 사용

String 타입

기본적으로 String 타입은 큰따옴표("")로 감싸진 문자열을 의미

선언한 변수에 문자열을 할당하는 방법

  • 문자열 리터럴을 할당하는 방법 : 변수 = “문자열”;
  • String 클래스의 인스턴스를 생성하여 할당하는 방법 : 변수 = new String(”문자열”);

String 클래스의 메서드

charAt() 메서드 - charAt() 메서드는 해당 문자열의 특정 인덱스에 해당하는 문자를 반환
compareTo() 메서드 - compareTo() 메서드는 해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교, 만약 두 문자열이 같다면 0을 반환하며, 해당 문자열이 인수로 전달된 문자열보다 작으면 음수를, 크면 양수를 반환
concat() 메서드 - concat() 메서드는 해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환
indexOf() 메서드 - indexOf() 메서드는 해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환
trim() 메서드 - 해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자를 제거
toLowerCase() 메서드 - 해당 문자열의 모든 문자를 소문자로 변환.
toUpperCase() 메서드 - 해당 문자열의 모든 문자를 대문자로 변환.

연산자

산술연산자

  • 덧셈 연산자(+) : 두 항의 값을 더한 값을 반환
  • 뺄셈 연산자(-) : 좌항의 값에서 우항의 값을 뺀 값을 반환
  • 곱셈 연산자(*) : 두 항의 값을 곱한 값을 반환
  • 나눗셈 연산자(/) : 좌항을 우항으로 나눈 값을 반환
  • 나머지 연산자(%) : 좌항의 값을 우항의 값으로 나눈 나머지를 반환

증감연산자

  • 전위형 증감연산자 : 증감 연산을 먼저 수행한 후, 그 결과값을 적용 ex) --num
  • 후위형 증감연산자 : 기존의 값을 먼저 적용시키고 그 다음에 증감 연산을 수행 ex) num++

복합 대입 연산자

  • num1 += 3 // num1 -> 13
  • num2 -= 3 // num2 -> 7
  • num3 *= 3 // num3 -> 30
  • num4 /= 3 // num4 -> 3
  • num5 %= 3 // num5 -> 1

비교 연산자

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

논리 연산자

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

  • AND 연산자(&&): 피연산자 두 개가 모두 true일 때 true를 반환하며, 피연산자 두 개 중 하나라도 true가 아니면 false를 반환.
  • OR 연산자(||): 피연산자 두 개 중 단 하나라도 true면 true를 반환하며, 피연산자가 모두 false인 경우에만 false를 반환
  • NOT 연산자(!)는 true와 false를 반대로 바꾸는 연산자

콘솔 출력

  • 출력하기 : System.out.print()
  • 출력하고 줄 바꾸기 : System.out.println()
  • 형식대로 출력하기 System.out.printf() - 지시자를 활용한다

콘솔 입력


import java.util.Scanner;                 // Scanner 클래스를 가져옵니다.

Scanner scanner = new Scanner(System.in); // Scanner 클래스의 인스턴스를 생성합니다.
String inputValue = scanner.nextLine();   // 입력한 내용이 inputValue에 저장됩니다.

System.out.println(inputValue);           // 입력한 문자열이 출력됩니다.

Scanner 클래스를 활용
scanner에는 문자열을 입력받는 nextLine()뿐만 아니라, 정수형을 입력받을 수 있는 nextInt(), 실수형을 입력받을 수 있는 nextFloat()등의 메서드들도 존재한다.

조건문

if 문

if문의 소괄호 안에는 boolean 값으로 평가될 수 있는 조건식을 넣어주고, 중괄호 안의 실행 블록에는 조건식이 참일 때 실행하고자 하는 코드를 적어준다

if (조건식) {
	//조건식이 참이라면 실행되는 블록
}

if...else문


if(조건식1) {
	//조건식1이 참이라면, 실행되는 블록.		
} 
else if (조건식2) {
	//조건식1이 참이 아니면서 조건식2가 참일 때, 실행되는 블록.
} 
else {
	//조건식1과 2가 모두 참이 아닐 때, 실행되는 블록.
	//else문은 생략 가능.
}

switch문

switch문은 if문처럼 조건식이 true일 경우에 블록 내부의 실행문을 실행하는 것이 아니라, 변수가 어떤 값을 갖느냐에 따라 실행문이 선택된다.

switch(입력변수) {
    case 입력값1: ...
         break;
    case 입력값2: ...
         break;
    ...
    default: ...
         break;
}

반복문

for문

for문은 조건식이 참인 동안 주어진 횟수만큼 실행문을 반복적으로 수행

public class Main {
  public static void main(String[] args) {
    int sum = 0;
    // for (초기화; 조건식; 증감식)
    for(int num = 0; num < 10; num++) {	
      sum += num;
    }
    System.out.println(sum); // 1~9의 합인 45가 출력됩니다.
  }
}
  • 초기화는 for문이 시작할 때 최초 한 번만 수행되며, 사용할 변수의 초깃값을 정한다.
  • 조건식은 계속 반복할지 여부를 결정하는 조건입니다. 조건식 안의 값이 true라면 실행문을 실행시키고, false라면 더 이상 블록을 실행하지 않고 끝난다.
  • 증감식은 반복 횟수를 결정하는 규칙입니다. 변수에 값을 더하거나 곱하는 등 수행 방식을 지정합니다. ++ 은 반복문에서 자주 쓰는 증감연산자로, 피연산자의 값을 1 증가시킨다.

while문

for문이 정해진 횟수만큼 반복한다면, while문은 조건식이 true일 경우에 계속해서 반복한다.
for문과 while문은 초기화, 증감식의 위치만 다를 뿐 상호 대체가 가능.

(초기화);
while(조건식) {
  실행문; //조건식이 참인 동안 실행
  증감식;
}

do-while문

while문은 조건식이 참일 때 코드가 실행되는 반면에, do while 반복문은 무조건 한번 이상 실행

do {
  (1)실행문 //처음 한 번은 무조건 실행
} while((2)조건식);

break문

break문은 반복문인 for문, while문, do-while문을 실행 중지할 때 사용
break문은 대개 if문과 같이 사용되며, if문의 조건식에 따라 for / while문을 종료 할 때 사용

for (...) {

break;

}

continue문

continue문은 반복문인 for문, while문, do-while문에서만 사용, continue문은 반복문을 종료하지 않고 다음 차례로 넘어가 계속 반복을 수행, break문과 마찬가지로 continue문도 보통 if문과 함께 사용하는데, if문의 조건을 만족하는 경우 continue문을 실행하여 그 이후의 코드를 실행하지 않고 다음 반복으로 넘어간다

public class Main {
    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0) { //나머지가 0일 경우는
                continue; //다음 반복으로 넘어간다.
            }
            System.out.println(i); //홀수만 출력
        }
    }
}

배열

배열이란, 동일한 타입의 값들을 하나의 묶음으로 묶은 자료 구조를 의미

  • 1차원 배열 : 배열이 중첩이 없는 경우 = 배열의 요소가 배열이 아닌 경우
    예 : { 1, 2, 3, 4 }
    배열의 각 요소는 1, 2, 3, 4로 모두 정수형의 값.
  • 2차원 배열 : 배열이 한 번 중첩된 경우 = 배열의 요소가 배열인 경우
    예 : { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } }
    배열의 각 요소로 배열이 들어가 있다.

1차원 배열의 선언과 초기화

1차원 배열을 선언할 때에는 다음과 같이 타입 뒤에 대괄호를 붙여서 선언하고 초기화할 수 있다

double[] temperatureOfJuly;
temperatureOfJuly = new double[31];

값 접근하기

double[] temperatureOfJuly = { 27.4, 30.1, 31.1, 32.4, ..., 31.8 };
  • 첫 번째 요소는 temperatureOfJuly[0]으로 접근할 수 있으며, 값은 27.4.
  • 두 번째 요소는 temperatureOfJuly[1]로 접근할 수 있으며, 값은 30.1.

배열의 길이

배열이 가진 요소의 개수를 배열의 길이 또는 크기라고 합니다. 배열의 길이는 배열참조변수_이름.length로 얻을 수 있다.

double[] temperatureOfJuly = new double[31];
System.out.println(temperatureOfJuly.length); // 31

2차원 배열의 선언과 초기화

int[][] kcal;
kcal = new int[31][3];

가변 배열

2차원 이상의 다차원 배열에서는 1차원보다는 자유로운 형태로 배열을 만들 수 있다. 즉, 배열이 2차원 이상일 때, 마지막 차수에 해당하는 배열의 길이를 고정하지 않아도 되며, 이러한 배열을 가변 배열이라고 한다.

int[][] ages = new int[5][];

이처럼 마지막 차수에 해당하는 배열의 크기를 지정하지 않으면 가변 배열이 생성

배열 탐색

반복문을 활용하여 배열을 탐색할 수 있으며, 기본적으로 인덱스와 배열의 크기(length)를 활용하여 탐색한다는 점에서 문자열 탐색과 비슷하다.

  • for문을 이용한 탐색
int[] scores = { 100, 90, 85, 95, 100 };
int sum = 0;

for (int i = 0; i < scores.length; i++) {
	sum += scores[i];
}
System.out.println(sum); // 470
  • while문을 이용한 탐색
int[] scores = { 100, 90, 85, 95, 100 };
int sum = 0;
int i = 0;

while (i < scores.length) {
	sum += scores[i++];
}
System.out.println(sum); // 470
profile
백엔드 취준생

0개의 댓글