25/01/22 (수)
8시 기상 > 9~18시 수업 > 19~20시 주짓수 > 12시까지 공부..를 이틀만 했는데 벌써 피곤이 쌓인 기분입니다.
그치만 아주 보람찹니다. 오늘도 힘내서 들어봐야죠!
1. WorkShop 발표
1) 쇼트서킷
논리연산자에서 좌측 피연산자만으로도 결과가 확정 된 경우, 굳이 우측 피 연산자의 계산 과정을 진행하지 않는 기능입니다.
||, && 등이 있습니다. 하지만 비트연산자는 |, &는 쇼트서킷이 적용이 되지 않습니다.
이유는 비트 연산자는 좌항과 우항의 자릿수의 비트에 대한 비트연산을 적용하는 방식으로 동작하기 때문입니다.
2) yield
java가 버전이 업데이트 되면서 새로 추가된 명령어라고합니다.
switch case문의 값을 시작하는 지점을 결과값을 반환합니다.
3) 부동소수점
double과 float는 부동( 浮動 )소수점을 사용하기 때문에 소수가 정교하지 않습니다.
그런데 왜 자바에서는 정교하지 않은 부동소수점을 사용할까요?
자바에서 부동소수점을 사용한 이유는 고정소수점은 범위가 제한적라 더 넓고 유연하게 계산하는 부동소수점을 채택했습니다.
2. 강의
2.1. CH5 참조 타입
1) 데이터 타입 분류
강사님> 워크샵 시간에 primitive type과 reference type의 차이를 설명해보라고 하셨습니다.
reference type이란 *객체의 주소를 참조하는 타입입니다.
primitive type으로 선언된 변수는 변수의 값 자체를 저장하고 있지만 reference type으로 선언된 변수는 객체가 생성된 메모리 주소를 저장합니다.
*객체 : 데이터(필드) + 메소드
변수들은 모두 Stack이라는 메모리 영역에 저장됩니다.
2) 메모리 사용 영역
강사님> 스택영역은 밑에가 막혀있는 프링글스 통같다
메소드가 호출되면 스택영역의 프레임에 저장되고 -> 메소드 호출이 끝나면 프레임은 자동 제거됩니다.
나> heap 영역에 객체가 생성되고 stack에 heap 영역의 주소가 저장되는건가요?
강사님> 그림의 예시에서는 그렇지만 나중에 더 많은 상황이 나올 수 있다.
3) 참조 타입 변수의 = 연산
참조(reference) 타입 변수의 값은 객체의 주소이므로 ==, != 연산자는 객체의 주소를 비교합니다.
따라서 true라면 동일한 객체를 참조, 아니라면 다른 객체를 참조하는 것이다.
그림에서는 메소드에서 Local변수로 선언된 m1, m2 객체는 heap에 저장되고 (<< 정확한지 잘 모름)
종료시 Stack에서 Heap의 참조가 끊기고 가비지가 됩니다.
int arr1[] = new int[] {1,2,3};
int arr2[] = new int[] {1,2,3};
int arr3[] = arr1[];
System.out.println(arr1 == arr2);
>> false
System.out.println(arr1 == arr3);
>> true
arr1과 arr2는 서로 다른 배열 객체로 생성되므로 주소가 다르고
arr3은 arr1의 주소를 대입했기 때문에 주소가 같습니다.
4) null과 NullPointerException
System.out.println(mc1);
>> local 객체는 사용 전 반드시 초기화 되어야 한다
MyClass mc4 = null;
>> 가리키는 객체가 없다 (명시적 표현 null)
LG CNS 공모주 청약하다가 순식간에 지나갔습니다.. 온 세상이 LG다.
16시에 청약 마감이라 어쩔수없었는데 여기부터 놓치니 끝까지 놓쳐버리더라고요.
아무튼 이 부분은 다시 공부해야하겠습니다.
> 잠이 오지만 복습중입니다.
- null : 아무 값도 가지지 않는 상태입니다.
참조 타입은 null로 초기화가 가능합니다.
null로 초기화 된 참조 변수는 stack 영역이 생성됩니다.
+모든 참조 변수가 heap영역에 생성되는게 아닙니다.
- NullPointException : 변수가 Null인 상태에서 객체의 데이터나 메소드를 사용하려 하면 발생하는 예외(오류)입니다.
reference type이 참조할 데이터가 null일때 생깁니다.
변수가 null이 되면 heap영역의 객체가 참조되지 않고, 참조 되지 않은 객체는 GC에 의해 garbage가 됩니다.
의문점> Primitive type은 null값을 가질 수 없을까요?
5) String 타입
// String 객체의 비교
String str1 = new String("Hello"); // heap 100
String str2 = new String("Hello"); // heap 200
String str3 = ("Hello"); // heap 300
String str4 = ("Hello"); // heap 300
// ==
System.out.println(str1 == str2); >>false
System.out.println(str3 == str4); >>true
System.out.println(str1 == str4); >>false
// equals()
System.out.println(str1.equals(str2)); >>true
System.out.println(str3.equals(str4)); >>true
System.out.println(str1.equals(str4)); >>true
문자열 *literal이 동일하면 String 객체를 공유합니다.
*literal : 직접 입력된 값, 변수의 값이 변하지 않는 데이터 << 더 알아봐야 할 듯
// String 메소드
String str = "Hello";
// length() : 문자열 길이
System.out.println(str.length());
// charAt() : 문자열 추출
System.out.println(str.charAt(0));
// replace() : 문자열 대체
System.out.println(str.replace("He", "AA")); //원본 유지
System.out.println(str);
// indexOf() : 문자열 검색
System.out.println(str.indexOf("l"));
// substring() : 문자열 자르기
System.out.println(str.substring(0,2));
System.out.println(str.substring(0, str.indexOf("l"))+ "X"
그리고 String 메소드들 입니다.
6) Array 타입
배열도 reference type입니다.
Heap 영역에 생성되에서 stack에서 참조가 됩니다.
강사님> Heap에 무언가가 만들어지면 무조건 초기화가 됩니다.
7) 다차원 Array
다차원 배열을 1번 2번처럼 표현하는 사람이 있는데 정확하게는 3번이라고 합니다.
8) 객체를 참조하는 Array
다시 공부하기
+int 같이 primitive type이 아닌 reference type 객체를 참조하는 배열입니다.
String Array를 만든다면 stack에서 heap 영역의 string array를 참조하고 string array에서는 string 객체를 참조합니다.
9) 배열 복사
강사님> 백엔드에서는 할 일이 없지만 코테에서는 가끔 있다. 그러니 따로 알아봅시다.
10) 배열 항목 반복을 위한 향상된 for 문
// for 문
for (int i = 0; i < intArr.length; i++) {
System.out.println(intArr[i]); >> Heap에 있는 원본 int 항목을 변경
}
// for each 문
for (int i : intArr) {
System.out.println(i); >> Heap에 있는 원본 int 항목을 복사한 local 변수 i 변경
}
더 간단하게? 배열을 출력할 수 있습니다.
11) Enum(열거) type
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
Enum : 불변의 항목을 열거할 때 사용합니다.
ex) 날짜, 요일, 계절
프로젝트를 할 때 코드로 관리할 것과 enum으로 관리할 것을 구분해야합니다.
2.2. CH6 클래스
1) 객체지향 프로그래밍
다형성이 많이 어렵다고 합니다.
웃으면서 들어갔다가 울면서 나온다고..
2) 객체와 클래스
★컴파일러는 생성자가 없으면 기본생성자를 넣어주고, 생성자가 있으면 넣어주지 않습니다.
3) 클래스의 구성 멤버
4) 필드 선언과 사용
수업을 놓쳐버렸습니다.
+ 이건 진짜 내일 복습!
5) 생성자 선언과 호출
강사님> this()와 this. 구분할것
6) 메소드 선언과 호출
7) 인스턴스 멤버
3. 마무리
1) WorkShop
나온 주제는 다음과 같습니다.
- 메소드 시그니처 : 메소드명과 매개변수의 자료형을 의미
- 객체지향과 절차지향의 차이
- 문자열과 문자열 상수의 차이 : 상수는 Method 영역에 저장되는데 문자열 상수는 GC의 제거 대상이 되지 않는가?
2) 개발자 유머
스위스 철도망에는 감지기가 있습니다.
이 감지기는 열차가 어디있는지 확인하기 위해서 레일에 설치되어 기차의 바퀴 개수를 카운트합니다.
그런데 이 감지기는 8자리 2진수로 작동되기 때문에
11111111(2) = 255( 2^8-1)에 도달하면 오버플로우가 생겨서 0이 되고 감지가 안됩니다.
하지만 스위스는 이를 간단하게 해결했습니다.
기차 바퀴가 256개를 가지는 것을 법적으로 금지했다고 합니다.
프로그래머들은 이것이 버그를 고치는 가장 이상적인 방법이라고 농담삼아 말한답니다.
인터넷 보다가 (저한테만) 재밌는 글이 있어서 가져와봤습니다.
비문이 너무 많아서 제가 다시 해석했는데 실제 있었던 일인가 의문이 생겼습니다.
스위스 연방철도 (SFF-CFF-FFS)웹사이트에서 찾았는데 역사철도협회(HECH) 웹사이트에 '256축 규칙'이 있다고 합니다.
2019.07.01 부터 유효하다고 하며 아직까지도 유효한것으로 보여진다고 합니다.
+이렇게까지 찾아본 이유는 강사님께서 가짜 정보의 확대, 재생산이 큰 문제라 해서 찾아봤습니다. 근데 아무리봐도 가짜같은데 어떻게 이게 진짜지
3) 질문할 것
2.1 4) Primitive type은 null값을 가질 수 없을까요?
'LG 유플러스 유레카 > 소프트웨어 엔지니어링' 카테고리의 다른 글
[4일 차] 소프트웨어 엔지니어링 (Ch06 ~ Ch07) (3) | 2025.01.23 |
---|---|
[2일 차] 소프트웨어 엔지니어링 (Ch03 ~ Ch04) (0) | 2025.01.21 |
[1일 차] 소프트웨어 엔지니어링 (Ch01 ~ Ch02) (1) | 2025.01.20 |