정처기 실기 오답노트 (5)

Spirit Lab·2025년 4월 14일

자바는 문자열을 캐싱한다. 그 말은 메모리 옆 캐시에 저장되며 println(str1==str2) 처럼 주소를 물어본다면 같은 위치에 있기에 true가 반환되는것이다.
여기서 참고로
데이터 타입 [참/거짓] : C는 숫자, Java는 소문자, Python은 앞대문자
C언어 : 1 / 0
Java언어 : true / false
Python언어 : True / False
파이썬은 겁나 큰 뱀이라 앞에 대문자, 자바섬 인도네시아 원주민들은 왜소하니까 앞에 소문자, C는 그냥 기계언어라 0아니면 1

이어서 가면 비슷한 원리로 str3가 새로운 string 객체를 생성하며 heap 메모리에 문자열을 넣었어 그러면 캐시에 있는 문자열과 heap 메모리의 문자열은 과연 같은 주소를 참고하고 있는걸까? 절대 아니지 그래서 2번째꺼는 false (대소문자 주의하자고)

3번째는 equals라는 메서드를 사용한걸 볼 수 있어 equals는 단순히 값만을 비교해
주소따위는 신경안쓴다는 말이지 그렇기에 만약 문자열 자체가 차이 나지 않는다면 true인것
따라서 3번과 4번 모두 참조하고있는 주소와 상관없이 true를 반환.


이건 take()에서 return된게 print된다는걸 실수로 깜빡해서 틀림...
보다가 stack인걸 알았는데 말이지...
그냥 후입선출되는거 알고 순서만 제대로 파악했으면 된다.


경계값은 TC를 많이 만듦으로 테스트입력값에 기존 입력값 외에 -1이 더 들어간다면 빼박으로 경계값 분석을 선택하면 된다.


*용어가 헷갈릴 때
프로그램 실행 여부에 따른 테스트 분류

정적 테스트 : 프로그램을 실행하지 않음. (ex. 코드 리뷰, 워크스루, 인스펙션)
동적 테스트 : 프로그램을 실행함. (ex. 화이트박스 테스트, 블랙박스 테스트)
화이트박스 테스트의 검증 기준(Coverage)

문장(Statement) : 모든 구문 실행해보기
분기(Branch) : 전체 조건 T/F 다 가보기
조건(Condition) : 개별 조건 T/F 다 가보기
화이트박스 테스트

기초 경로 검사(Base Path) : McCabe 제안
제어 구조 검사(Control Structure) : 조건 검사, 루프 검사, 데이터 흐름 검사(변수 정의 및 사용 위치 기준)
블랙박스 테스트

동치 분할 검사(Equivalence Partitioning) : 각 조건마다 대표 TC 개수를 동일하게 정함
경계값 분석(Boundary Value Analysis) : 경계값 TC를 많이 만듦
원인-효과 그래프 검사(Cause-Effect Graphing) : 출력에 미치는 영향 분석 후 효용이 높은 TC 선정
오류 예측 검사(Error Guessing) : 테스트 수행자의 경험과 감각
비교 검사(Comparison) : 여러 버전에 같은 TC를 돌려 같은 결과가 나오는지 확인



-화이트박스 테스트-

조건 - 개별

결정 - 전체

조건/결정 - 개+전

변경 조건/결정 - 향상

다중조건 - 100%

기본경로 - 수행가능한 모든경로

제어흐름 - 그래프형태

이거 진짜 이해하는데 한 세월 걸렸다. ㅋㅋㅋㅋ....
자 우선, 우리가 이 문제를 풀기 위해 알아야되는 개념이 3개정도 돼
첫번째 다형성
두번째 오버라이딩
세번째 인스턴스 메서드와 this

차근차근 알아가 보자!
일단 실행되는 첫줄인 A b = new B() 경우
A 클래스 타입으로 만들어진 B 객체야 우리는 이걸 다형성이라고 해 유지보수를 위해서 많이 쓰이는 방식이야
그러면 다형성의 경우 어떤식으로 실행이 되냐
A의 설계도를 가지고 있지만 어쨌든 B의 객체이기 때문에 우리가 b의 메서드를 실행하면 B의 객체에서 실행이 돼 여기서 B는 A를 상속한 후 B에서 메서드를 재정의 하는데 우리는 이걸 오버라이딩이라 해
그래서 처음 b.paint()가 B객체에서 실행이 되고 그 안의 super.draw() 실행될거야
그렇게 되면 부모인 A의 draw()가 실행되겠지
그래서 처음 프린트되는 문자는 B가 될거야
그 다음이 중요한데, B를 프린트하고 나서 그 다음줄의 draw()는 과연 어디서 실행이 되는걸까?
static을 제외한 클래스 내부의 메서드들을 우리는 인스턴스 메서드라고 불러 이러한 인스턴스 메서드들은 자동적으로 호출되면 앞에 this를 붙혀.
그러면 B 프린트 후의 draw()는 암묵적으로 this.draw()가 되는거지
그러면 this.draw()는 뭘 가리킬까? draw()가 A객체내부에 있는데 당연히 A아니야? 라고 생각하기 쉽지만, this가 가리키는 것은 정의 위치를 기준으로 하는것이 아니라 호출 위치를 기준으로 해
우리가 처음 무슨 짓을 했더니 A객체의 this.draw()가 실행이 됐을까? 바로 B 객체의paint메서드 내부 super.draw()에서 실행을 했기 때문에 저기까지 갔던거야 따라서 this는 B의 객체를 가리키는 거야 그래서 B의 draw() 결과인 D가 프린트 돼
그 다음은 super.draw() 다음 줄의 C가 프린트되고 그 다음 줄의 this.draw()가 뭘 가리키는지는 다들 알겠지? 다시 D를 프린트한 후에 main의 b.draw()로 가면 마지막으로 D가 한번 더 프린트되고 모든 출력이 끝나 그리고 println이 아닌 print이므로 한줄에 붙어서 나오겠지 결과는 BDCDD

진짜 이렇게 보면 별거아닌데 처음에 보면서 화가 나긴 처음이었다... 정복!
ㅋㅋㅋㅋ 처음에 보고 빡쳐서 답변 이렇게 씀

profile
For the champagne

0개의 댓글