주간 랩업/[SSG] JAVA 기반 백엔드 개발 과정

[2주차] 자바 베이직 4일차 - 8일차

hooooolly 2024. 6. 22. 15:28

순식간에 주말이 지나가고 월요일이 되었다..!

이제 일주일밖에 지나지 않았는데 벌써 피로함이..ㅜ 종합비타민 하루에 두번은 꼭꼭 먹어야지. 그리고 운동은 못해도 스트레칭은 매일해보자고 다짐했다. 오래 공부하기 위해선 체력이 필수니까..!

 


 

2024/6/17

자바 베이직 4일차 - 연산자


오전에는 자바 기본 강의계획서를 보며 앞으로 배울 내용에 대해 설명을 들었다. 아직은 갈길이 멀다.

연산자의 종류로 증감, 부호, 비트, 논리, 산술, 쉬프트, 비교, 삼항, 그리고 대입 연산자가 있고, 연산이 수행되는 우선순위가 있다는 점, 증감 연산자, 비트 연산자, 논리 연산자, 대입 연산자의 연산 방향은 오른쪽에서 왼쪽으로 수행한다는 것을 배웠다.

비트 논리 연산자의 경우, byte, short, int, long만 연산가능하며 float,double은 불가능하다는 것을 배웠다.

비트 논리 연산자의 구분으로는 AND, OR, XOR, NOT이 있으며 비트의 맨 앞자리가 0이면 +, 1이면 -를 의미한다.

그리고 나눗셈 연산 시 주의해야할 점이 있다.

정수 또는 0.0을 0 또는 0.0 으로 나눌 경우 Infinity와 NaN 에러가 나와 정확한 결과를 알 수 없다. 그래서 먼저 에러 확인 후 연산을 수행하는 것이 좋다.

 

 

Overflow 와 Underflow

데이터 타입의 범위를 벗어났을 때 발생하는 에러. 자바에서는 값을 Wrap-Around 하여 범위의 양끝으로 돌아간다. 

Not a Number

  • 자기 자신과 같지 않다: NaN == NaN은 false를 반환합니다. 대신 Double.isNaN(value) 메서드를 사용하여 NaN인지 확인할 수 있습니다.
  • 연산 전파: NaN이 포함된 연산은 대부분 NaN을 반환합니다. 예를 들어, NaN + 5는 NaN을 반환합니다

Infinity

소수형에서 값이 너무 커서 표현할 수 없을 때 발생하는 값이다. 

 

  • Positive Infinity (+Infinity): 양의 무한대. 예를 들어, 1.0 / 0.0은 +Infinity
  • Negative Infinity (-Infinity): 음의 무한대. 예를 들어, -1.0 / 0.0은 -Infinity

 

프로그램의 안정성과 신뢰성을 보장하기 위해 이러한 예외와 값들을 처리하는 것은 매우 중요한데, 에러에 대해 막막해하지 않고 관심을 가져가겠다고 생각했다.

 


 

2024/6/18

자바 베이직 5일차 - 제어문


 

오늘은 전 날까지 배웠던 내용을 아침에 퀴즈로 풀었다.

float과 int는 4바이트이기 때문에 자동 캐스팅 되어 129 라는 리터럴 정수를 입력했을 때 자동으로 float b에 담기게 된다. 자바에서 100.0과 같이 소수는 기본 double로 생성되기 때문에 float형으로 형변환을 해주어야 한다.

  1. "변수" 는 컴퓨터 프로그램이 처리할 데이터를 저장하는 저장 위치이고, "상수"는 final 키워드를 사용하여 데이터를 저장할 수 있는 메모리 공간이지만, 프로그램이 실행되는 동안 메모리에 저장된 데이터를 변경할 수 없고 반드시 선언과 동시에 초기화해야 한다.
  2. 변수의 유형 중 "지역변수"는 메서드 내부에 선언된 변수이고, "정적변수"는 static 키워드로 정의된 클래스 변수이며, "멤버변수=인스턴스 변수"는 클래스 내부에 정의되지만 메서드 내부에는 선언되지 않는 변수이다.

제어문의 종류로는 "선택제어문"과 "반복제어문"이 존재한다.

선택제어문 : if, switch

반복제어문 : for, while

 

잠깐 배운 람다식 표현.

람다를 쓸 때 주의사항이 있다.

리터럴 값은 yield 불가능, 수식 연산에 의한 값만 대입 가능하다

반드시 default를 포함한다

 

그리고 오늘 한 것들인데 바쁘다 바빠~~ 아직 분석한 코테 문제를 블로그 안올렸다. 오늘 올려야지!

 

 

 

 

 

 


 

2024/6/19

자바 베이직 6일차 - 제어문


 

 

6일차는 어제 배운 선택 제어문과 반복 제어문을 주어진 조건에 따라 메뉴를 출력하고 실행하는 도서몰 장바구니 프로그램을 만들어보았다. 

 

기본적인 Switch 문을 사용하지 않고, 어제 배운 람다식 표현법을 쓰고 싶어서 람다식으로 메뉴 선택 기능을 구현해보았다. 처음 써보는 람다식이라 까다로웠지만 활용해보아서 좋았다. 작은 프로그램이지만 실행 순서와 조건을 분석하고 구현할 수 있었다. 아직은 main 메서드 내에서만 구현되어 있지만, 메서드와 인스턴스를 배우고 난 뒤 기능을 따로 만들어갈 것이라고 한다. 나는 선행 학습으로 메뉴 출력문 부분과 1. 고객 정보 확인하기 메뉴를 인스턴스로 만들어보았다.

 

 

 


 

2024/6/20

자바 베이직 7일차 - 메서드


어제의 복습 : 

실행의 흐름이란 메인 메소드의 시작 중괄호에서 끝 중괄호까지 위부터 아래로 실행되는 흐름이다.

이 흐름을 개발자가 원하는 대로 제어하고 바꿀 수 있도록 하는 것이 흐름 제어문이다.

선택 제어문 : 실행의 흐름을 제어하여 내가 원하는 흐름을 만든다

반복 제어문 : 중복되는 부분을 자동화하여 코드의 수를 줄임

 

메소드를 배우고 최종적으로 어제 만든 도서 사이트 장바구니 프로그램에 적용시켜 보았다. 메소드를 통해 반복되는 특정한 기능을 하나로 묶을 수 있었고, 거대해진 프로그램을 작은 단위로 쪼갤 수 있었다. 이렇게 메소드를 생성하고 main에서 분리시키면서 느낀 점은 메소드를 잘 사용하면 소스 코드의 가독성이 좋아졌다는 것이다. 길어진 main 메서드가 전보다 간단해져서 한눈에 볼 수 있었다.  그리고 자주 사용하는 print 와 같은 특정한 기능을 따로 분류하고 관리하기 때문에 코드를 수정하기 쉽고 중복되는 코드를 방지할 수 있었다.

그 외 메소드의 구조로 접근제한자, 반환 유형 등을 배웠는데, 프로그래밍을 하기 전 먼저 구조를 생각해보고 어떤 식으로 정의내리며 구현할 것인지 논리적으로 생각하는 것이 중요하다고 느꼈다. 그래서 이번에는 바로 문제를 풀지 않고 어떤 기능을 메서드로 만들 것인지 보고, 메서드로 만들었을 때 필요한 것들을 나열한 후 프로그래밍에 임했다.

그리고 하나의 메서드에서도 사용자가 입력하는 데이터 타입이 모두 다를 수 있으며, 이를 위해 메소드 오버로딩이 필요하다는 것을 배웠다. 오버로딩 기술을 적용한다면 하나의 메서드명으로 다양한 동작을 제공해줄 수 있다는 점이 흥미로웠다. 

 

 

 

 


 

2024/6/21

자바 베이직 8일차 - 


벌써 2주차가 끝나버렸다..! 

시간이 참 빠르다고 느끼며 오늘 배운 내용을 정리해본다.

 

오늘은 어제의 숙제였던 문제를 코드리뷰하는 시간을 가졌다. 코드리뷰에 있어서 중요한 점은, 문제를 해석할 때 입력 조건, 종료 조건, 실행 조건을 분석하고 코드에 들어가야하는 것이다. 그리고 디버그와 Junit 테스트를 통해 테스트를 해가며 결과를 봐야한다.

그리고 더 찾아본 부분..! 바로 이 문제였는데,

public class Main {
	public static void main(String[] args) {
		String input = "12345";
		for (int i = 0; i < input.length(); i++) {
			char c = input.charAt(i);
			int num = c - '0';
			System.out.println("Character: " + c + ", Number: " + num);
		}
	}
}

자바의 자동 형변환ASCII 코드 값에 대한 이해가 있다면 한 줄로 깔끔하게 풀 수 있었다. ASCII 코드도 배우고 자동 형변환도 배웠지만, 이 문제를 봤을 때 떠오르지 않았다. 기본부터 확인해야겠다는 생각이 들었다.

그래서 위 코드를 설명하자면, 0의 ASCII 코드는 48이고 1의 값은 49, 2는 50이고 이렇게 하나씩 늘어서 9까지 존재한다. 첫번째 시작하는 0의 ASCII 코드인 48을 다른 수에서 빼면 해당 문자의 숫자값을 얻을 수 있다. char 타입끼리 연산을 하면 int 형으로 자동 형변환 되어 String.valueOf()메소드를 사용하지 않고 String형을 int형으로 변환할 수 있다. 예를 들어, '3' - '0' 연산은 51 (ASCII 코드 값) - 48 (ASCII 코드 값)과 같아서 3이 되고 이 결과는 int 타입으로 변환된다.

 

오늘은 객체지향과 클래스, 구성요소, 데이터 타입, null, 배열 타입에 대해 배우고 실습을 해보았다.

객체지향 구성요소로 클래스, 객체, 캡슐화, 상속, 다형성, 추상화 가 있는데, 상속의 정의에 대해 잘못알고 있던 부분이 있었다. 이미 존재하는 한 클래스의 멤버(멤버는 필드와 메서드를 말한다)를 다른 클래스가 사용할 수 있도록 허용하는 기법이다. 자바에서는 자식(=하위/서브 클래스)이 부모(=상위/슈퍼 클래스)에게 요청을 하고 부모가 허락했을 시에만 부모의 멤버를 자식이 받을 수 있다. 자바는 단일 상속만 가능하기 때문에 안전하고 정확하게 (데이터의 신뢰성) 확장과 공유가 가능해지는 것이다. 이러한 계층적 구조로 인해 데이터의 관리가 용이해져서 M&A를 할 때 편리하다는 것을 알게 되었다.

그리고 추상화는 클래스를 만드는 모든 과정이 사실 추상화 기법을 사용하는 것이고 추상화를 통해 나오는 결과물을 산출물이라고 한다. 추상화가 실제 클래스를 만들 때 어떻게 적용이 되는 건지 좀 더 알아봐야겠다고 생각했다.

 

기본 데이터 타입 이외 참조 타입이 있는 것을 배웠는데 참조 타입 개념을 정리할 수 있어서 좋았다. 특히 이미 생성되어 있는 배열을 변수명을 달리한 새 배열 변수에 대입했을 때, 복사해온 배열의 주소값이 저장되어서 두 배열 변수의 값은 같았던 결과가 기억에 남는다.

 

이번 주말에는 객체지향 프로그래밍과 참조 타입에 대해 복습하고, 생성자, 인터페이스에 대해 예습해보려고 한다.