일단은 자동 형변환이다.
익숙하게 잘사용하고 있으나. 원리를 잘 파악못하고 사용하고 있었다.
어떠한 두개의 리터럴 값이 계산될때 표현의 수가 더 큰 것으로 형변환이 이루워 진다.
예를들어 3(정수)+ 4.5(실수) 일경우 계산의 순서를 보자면
(3 + 4.5) -> (자동형변환)(3.0 + 4.5) -> (7.5)
이렇게 형변환되어 계산된다.
또한 정수와 정수의 나눗셈의경우 결과값이 실수가 나올수 있는데 연산시에 형 변환을 시켜주지 않으면 잘못된 값이 나오기때문에 주의해야한다. 예를들어서 아래의 식을보면
double div = 10 / 20;의 div의 값을 확인해보면 0.5가 나와야 하는데 0이나오게된다.
이유는 div변수에 대입전에 실수가 아닌 10과 20 정수형으로 연산을 처리하였기때문에 소숫점이 버려져 0이되는것이다.
그렇기에 형변환을 명시적으로 해줄필요가 있다.
double div = (double)10/20;이 대입시 10을 명시적(강제 캐스팅) 시켜줬으므로
10.0 / 20으로 변환되고 자료형이 다른 두 수의 연산에서 표현의범위가 더 큰 자료형으로 형변환되므로 10.0/20.0으로 자동형변환이 이뤄지고 연산되어 0.5의 값이 double div의 변수에 들어가게된다.( 와 이걸 몰랐다는건 나 좀 심각했다는건가...)
두번째는 == 에대해서이다. == 이 비교문은 값이 같은것인지 비교하는것이 아니다. 주소 값을 비교하는것이다.
값이 같은지를 비교하려면 equals르 비교해야한다. 참조 객체중에 String의 경우 ==로 값을 비교하면 잘못될수 있는데 이유는
String은 객체이지만 인스턴스를 생성시에 "new 생성자()"를 생략하고 바로 문자열을 변수에 집어넣을수 있는 특이한 객체이다.(다른 객체들도 객체를 바로 대입해서 넣을수 있지만 문자열은 객체가 아니기에)
예를들어
1.String txt = "안녕";
2.String txt = new String("안녕")
위와 같이 두가지로 초기화할수 있다.
그럼 뭐가 문제란 말인가? 일단 위에 두가지의 경우 메모리에 올라오는 방식이다르다.
1번 케이스의 경우에 해당 텍스트는 Heap 메모리 영역에 String Constant Pool이라는 영역에 적재된다.
문자열들이 모여있는곳으로 한번 만들어진 문자열의 경우에 재사용된다.
예를들어 String a = "안녕"; String b = "안녕"; 이라는 두개의 변수를 선언시에 처음 a에서 "안녕"이라는 문자열이 String Constant Pool에 특정 메모리 주소에 생성되고 그이후에 개발자가 같은 문자열을 생성하게되면 새로 주소 값을 생성하는것이 아니라 a에서 쓰인 값의 주소값으로 재사용된다는것이다. 그렇기 때문에 == 비교문으로 연산시에 같은 주소값을 참조하고 있으므로 true가된다.
하지만 2번째의 경우는 다르다. 객체를 새로 생성할때 즉 new 키워드를 가지고 생성시에 새로 메모리 주소를 할당 받고 그 메모리 주소 값이 해당 문자열이 생성된다. 그렇기 때문에 String a = new String("안녕"), String b = new String("안녕")의 경우 같은 문자열을 가지고 있지만 주소값은 서로 다른 값을 가지고 있다. 그렇기 때문에 주소값을 비교하는 ==연산자로 비교하면 같은 문자열을 가지고 있음에도 false가 나오는것이다. 이렇기 때문에 값자체를 비교하는 equals() 메소드를 이용해서 String을 비교하여야 안전한것이다.
느낀점.
요즘 나라에서 지원하는 교육을 듣고 있는데..교육을 듣길 잘한것같다. 개발자가 되어 많지는 않지만 여러 개발을 해왔지만. 왜사용하는지도 모르고 사용하는것들 가장 기본적인것들을 잃어버리고 그냥 사용하고 있었다. 나라는 개발자는 결국 순살아파트와 같이 허대만 멀쩡하게 우둑커니 서있었던건 아니였을까... 주변 지인개발자들에게 교육을 듣는다고 하면 엄청 나쁘게보고 있다. 왜 그런걸듣는지 이해를 못하겠다는 눈빛과 말투로 나를 쏘아붙인다. 취업이 먼저라고 이력서나 내라고 난 개발이 먼저다. 돈을 조금 벌어도 내가 할수있는 스펙이 높아지면 그게 더 좋다. 어릴때부터 내가 무언가를 만드는걸 좋아했지. 부품이되는걸 좋아하지 않았다. 물론 세상을 살아가다보면 사회에 부품이 되어 살아가야겠지만. 그래도 혼자서 만드는것을 포기하고 싶지 않다. 항상 남의견에 따라서 잣대없이 결정했던 나날들이 후회된다. 내삶은 내가 사는것이니까 남들이 뭐라하면 그건 남들이 잘못된것이지 내가 잘못된것이 아니다. 내가 하고싶은대로 사는것이 제일 좋다. 서버까지 열심히해서 나의 서비스를 오픈하는날까지 화이팅.
'ETC.자바의 기초지식' 카테고리의 다른 글
3.자바를 다시 배우면서 알아가는것들 3 (1) | 2023.10.20 |
---|---|
자바를 다시배우면서 알아가는것들 2 (0) | 2023.10.19 |