게시글
질문&답변
2024.04.25
14 출력이 강의와 다릅니다.
안녕하세요? 바로 윗줄에서 %n 을 누락하여 발생한 현상입니다. System.out.printf("%6.2s", "Java"); // 수정 전 System.out.printf("%6.2s%n", "Java"); // 수정 후 윗줄에서 %n 이 없으니 줄바꿈이 되지 않았으며, 6자리 공간을 확보하고 우측 정렬하여 2글자인 Ja 를 먼저 출력하지요. (1) _ _ _ _ J a System.out.printf("%-6.2s%n", "Java"); 그런 다음에 이어서 위 코드를 실행하게 되니, 6자리 공간을 확보하고 좌측 정렬하여 2글자인 Ja 를 출력하게 됩니다. 즉 (2) J a _ _ _ _ 가 되겠네요. 그런데 둘 사이에 줄바꿈이 없으므로 (1) _ _ _ _ J a (2) J a _ _ _ _ 가 합쳐져서 실제로 보기에는 _ _ _ _ J a J a _ _ _ _ 이렇게 보여지게 된 거에요. 보다 더 확실히 차이를 확인하고 싶다면 이렇게 해보시면 되겠네요. System.out.printf("%6.2s", "ABCD"); // 처음 두 글자 AB System.out.printf("%-6.2s%n", "EFGH"); // 처음 두 글자 EF 위 예제에서는 각각 출력 문장이 (1) _ _ _ _ A B (2) E F _ _ _ _ 이렇게 될텐데, %n 에 해당하는 줄바꿈이 없으니 둘이 합쳐져서 _ _ _ _ A B E F _ _ _ _ 이렇게 출력이 되겠네요 😊 감사합니다. 덧) 첫 번째 스크린샷 이미지는 코드가 잘려서 정확한 확인은 어렵지만 아마도 동일하게 코드 윗줄에서 %n 을 누락하신 것 같아요 😋
- 0
- 1
- 27
질문&답변
2024.04.25
7장에서 메소드 영상을 보다가 궁금한 점이 있어서 연락드립니다.
안녕하세요? 문의주신 내용은 아마도 아래 코드에 대한 질문인 것 같군요 😀 int getVideoFileCount(int type) { if (type == 1) { // 일반 영상 return 9; } else if (type == 2) { // 이벤트 영상 return 1; } return 10; } 말씀하신 것처럼 첫 번째 if 문의 조건을 확인하여 참이면 if 문 내의 문장이 실행되고, 그 이후에는 if 문 밖으로 빠져나와서 이어서 계속하여 코드가 실행되는 것은 맞습니다. void printColor(int color) { if (color == 1) { System.out.println("파란색"); } else if (color == 2) { System.out.println("빨간색"); } System.out.println("색을 출력했어요"); } 만약 위와 같이 코드가 되어 있었고 전달 받은 color 변수가 1 이라면 파란색 색을 출력했어요 color 변수가 2라면 빨간색 색을 출력했어요 그 외의 값이라면 색을 출력했어요 가 출력될 것입니다. 하지만 문제는 바로 return 이에요. 메소드 내에서 return 을 만나면 그 즉시 메소드를 탈출하게 됩니다. 이후에 실행될 코드가 더 있건 말건 상관 없이 말이죠! 마치 아래 코드처럼 생각하시면 됩니다. 이 코드를 작성해보면 void printColor(int color) { return; System.out.println("파란색"); System.out.println("빨간색"); System.out.println("색을 출력했어요"); } 아래와 같이 Unreachable statement 라며 에러가 발생하게 됩니다. 첫 줄의 return; 에 의해 바로 메소드를 탈출하게 되므로 이후에 있는 print 구문들은 실행조차 되지 않으니 확인해보라는 의미인 것이죠. (사진) 다시 원래 코드로 돌아와서, int getVideoFileCount(int type) { if (type == 1) { // 일반 영상 return 9; } else if (type == 2) { // 이벤트 영상 return 1; } return 10; } type 이 만약 1인 경우에는 return 9; 의 동작이 실행되면서 메소드를 바로 탈출하게 되고 이와 동시에 9 를 반환하게 됩니다. 그래서 if 문 밖에 있는 코드인 return 10 은 아예 실행이 되지 않는 것이랍니다. 궁금증 해결에 도움되길 바라겠습니다 😊 감사합니다.
- 0
- 1
- 28
질문&답변
2024.03.31
퀴즈 13 질문입니다.
안녕하세요? 새로운 질문을 작성하시기 전에 작성된 질문이 올바로 삭제되지 않은 문제가 있었던 것 같습니다 😅 아래 링크에 답변을 작성하고 새로운 질문을 확인 중인데 제가 말씀드린 소스코드가 이번 질문에서는 순서가 올바로 작성되었네요! 👉 https://www.inflearn.com/questions/1223648 결과적으로 코드를 잘 작성해주셨습니다. 파일의 내용을 읽어와서 어떤 작업을 할 때 일반적으로는 while (true) { ... } 와 같은 무한 반복문 보다는 작성해주신 것처럼 while ((line = br.readLine()) != null) { ... } 와 같은 코드를 많이 사용합니다. 혹시 어떤 문제로 반복문을 올바로 탈출하지 못하고 계속 반복하는 경우를 방지하기 위해서 그렇습니다. 그리고 (속담 퀴즈입니다 ~ 수고하셨습니다) 부분을 try catch 문 외부에 넣거나 내부에 넣거나 큰 차이는 없습니다. 다만 (수고하셨습니다) 부분이 try catch 외부에 있게 되면 try 문 내에서 어떤 문제가 발생하여 퀴즈가 올바로 진행되지 않았을 경우에도 (수고하셨습니다) 라는 문장이 출력되는 경우가 발생할 수 있겠네요. 사용자는 퀴즈를 하나도 풀지 못했는데 수고했다는 메시지를 출력하면 프로그램의 동작이 다소 매끄럽지 않을 수 있습니다. 이런 경우에는 try catch 내에서 (수고하셨습니다) 라는 메시지를 출력하되, 예상치 못한 오류에 대비하여 catch 문 내에서 (문제가 발생하여 퀴즈가 올바로 진행되지 않았습니다) 정도의 메시지를 출력하면 더 좋을 것 같습니다 😊 감사합니다.
- 0
- 2
- 77
질문&답변
2024.03.31
퀴즈13 질문입니다.
안녕하세요? 작성해주신 코드를 그냥 실행했을 때는 퀴즈가 바로 제시되지 않고 사용자 입력을 기다리는 문제가 있었습니다. 그래서 다음과 같이 while 문 내에서 주석으로 1, 2 작성한 부분의 코드를 수정해봤어요. while ((line = br.readLine()) != null) { System.out.println(line); // 2. 이 곳으로 이동하여 문제 먼저 출력 String answer = br.readLine(); String input = sc.next(); // System.out.println(line); // 1. 이 곳에 있던 코드를 System.out.print("정답 입력 ==> "); if (input.equals(answer)) { System.out.println("정답입니다!!!"); } else { System.out.println("틀렸습니다. 정답은 " + answer); } } 이렇게 했을 때 다음과 같이 올바로 퀴즈를 진행할 수 있었네요. 속담 퀴즈입니다. 빈 칸에 알맞은 말을 입력하시오. (주관식) ------------------------------------------------- (문제) 세 살 __ 여든까지 간다 정답 입력 => 버릇 정답입니다!!! (문제) 소 잃고 ___ 고친다 정답 입력 => 화장실 틀렸습니다. 정답은 외양간입니다. (문제) 천 리 길도 한 __부터 정답 입력 => 끼니 틀렸습니다. 정답은 걸음입니다. ------------------------------------------------- 모든 퀴즈가 완료되었습니다. 수고하셨습니다. ^^ 결과적으로 코드를 잘 작성해주셨습니다. 파일의 내용을 읽어와서 어떤 작업을 할 때 일반적으로는 while (true) { ... } 와 같은 무한 반복문 보다는 작성해주신 것처럼 while ((line = br.readLine()) != null) { ... } 와 같은 코드를 많이 사용합니다. 혹시 어떤 문제로 반복문을 올바로 탈출하지 못하고 계속 반복하는 경우를 방지하기 위해서 그렇습니다. 그리고 (속담 퀴즈입니다 ~ 수고하셨습니다) 부분을 try catch 문 외부에 넣거나 내부에 넣거나 큰 차이는 없습니다. 다만 (수고하셨습니다) 부분이 try catch 외부에 있게 되면 try 문 내에서 어떤 문제가 발생하여 퀴즈가 올바로 진행되지 않았을 경우에도 (수고하셨습니다) 라는 문장이 출력되는 경우가 발생할 수 있겠네요. 사용자는 퀴즈를 하나도 풀지 못했는데 수고했다는 메시지를 출력하면 프로그램의 동작이 다소 매끄럽지 않을 수 있습니다. 이런 경우에는 try catch 내에서 (수고하셨습니다) 라는 메시지를 출력하되, 예상치 못한 오류에 대비하여 catch 문 내에서 (문제가 발생하여 퀴즈가 올바로 진행되지 않았습니다) 정도의 메시지를 출력하면 더 좋을 것 같습니다 😊 감사합니다.
- 0
- 3
- 78
질문&답변
2024.03.31
수업질문입니다
안녕하세요? 클래스 단원의 시작 부분에서 객체 지향 프로그래밍 (OOP : Object-Oriented Programming) 에 대한 특징을 살펴보면서 유지보수 용이, 그리고 말씀하신 높은 재사용성에 대해 설명 드렸습니다. 자바는 객체 지향 프로그래밍의 한 종류이며 이 외에도 C++, C#, Python 등 여러 객체 지향 프로그래밍 언어가 있어요. 객체 지향 프로그래밍 언어 중 하나인 자바의 높은 재사용성은 다음 이유로 설명될 수 있습니다. 상속과 다형성 자바에서는 새로운 클래스를 작성할 때 기존 클래스에서 필요한 기능을 상속 받아 사용하고, 이를 통해 동일한 코드의 중복을 줄이고 이미 작성된 코드를 재사용할 수 있습니다. 인터페이스와 추상 클래스 인터페이스와 추상 클래스를 사용하면 다양한 클래스가 동일한 인터페이스나 추상 클래스를 구현하거나 상속 받아 사용할 수 있으므로 재사용성이 높아집니다. 높은 재사용성이 자바라는 언어 하나만 가지는 특징은 아니랍니다 😊 감사합니다.
- 0
- 1
- 50
질문&답변
2024.03.19
반환값(RETURN) 에 대한 질문
안녕하세요? return 을 사용하게 되면 그 즉시 return 을 포함하는 메소드의 동작이 종료되고 메소드를 호출한 쪽으로 넘어가서 동작이 이어 진행됩니다. 이때 return 뒤에 어떤 값이 있다면 그 값을 반환하고, 메소드를 호출한 쪽에서는 이 값을 받아서 사용할 수 있게 되지요. (사진)위와 같이 getPhoneNumber() 메소드를 호출하게 되면 main() 메소드의 동작은 거기서 잠시 멈추고 getPhoneNumber() 메소드의 동작을 수행하게 돼요. 그런 다음에 이 메소드 안의 return 을 만나면 phoneNumber 를 main() 메소드에 반환하며 getPhoneNumber() 메소드의 동작은 끝이 난답니다. 그럼 처음에 이 메소드를 호출한 main() 메소드에서는 return 에 의해 반환된 phoneNumber 를 contactNumber 에 저장하고 이어서 아랫줄에 있는 호텔 전화번호를 출력하는 동작을 진행하게 되구요. getAddress() 또한 동일합니다. 이 메소드를 호출하게 되면 main() 메소드의 동작은 잠시 멈추고 getAddress() 메소드 안에 정의된 동작이 수행됩니다. 그런 다음 "서울시 어딘가" 를 return 에 의해 반환하게 되면 메소드의 동작도 끝이 나게 되고 main() 메소드에서는 address 라는 변수로 그 반환값을 받아서 다음 줄에서 호텔 주소를 출력할 수 있게 되는 순서로 동작하게 됩니다. 그림의 1~4 부분을 보시면 보다 이해가 수월하실 거에요 😊 감사합니다.
- 0
- 1
- 76
질문&답변
2024.03.14
메소드 강의 질문
안녕하세요? 클래스(Class)와 객체(Object)는 정말 정말 어렵고 헷갈리는 내용입니다. 이렇게 한 번 설명을 드려볼게요. 대중교통의 대표적인 종류로는 수많은 사람을 실어 나르는 버스가 있습니다. 도심에는 특히 굉장히 많은 노선의 버스가 운행되고 있지요. 버스는 운전 기사분께서 마음대로 운행을 할 수는 없습니다. 정해진 시간, 정해진 노선, 정해진 금액 등에 따라 운행을 하게 됩니다. 필요에 따라 기존 노선이 바뀔 수도 있고 새로운 노선이 생길 수도 있습니다. 그런데 사실 버스마다 조금씩 분위기가 다르기도 합니다. 어떤 기사님은 매우 친절히 인사를 하시기도 하지만 어떤 기사님은 가벼운 목례만 하거나 승객분들과 눈을 마주치지 않는 경우도 있습니다. 또 운전을 매우 부드럽게 하시는 분도 계시는가 하면 다소 난폭하게 하시는 분도 계십니다. 정해진 시간, 정해진 노선으로 운행을 하긴 하지만 약간씩의 차이가 있을 수 있지요. 지금까지 버스 요금은 성인 기준 1,000 원이었다고 가정하겠습니다. 그런데 내일부터 갑자기 1,200 원으로 버스 요금을 인상하겠다고 발표합니다. 그러면 버스를 이용하는 모든 승객은 내일부터 동일한 버스를 인상된 가격인 1,200 원을 지불하고 타야 합니다. 이것이 바로 클래스(Class) 와 객체(Object) 의 차이입니다. 클래스는 버스의 운행 노선, 주기, 금액 등을 설정하는 주체 개념입니다. 버스에 몇 명까지 태울 수 있고 입석을 허용할지, 운행 노선은 어떻게 되고 출퇴근 시간에는 자주 운행하도록 하여 시민들의 불편을 최소화할 수 있습니다. 그리고 이렇게 정해진 규칙에 따라 운행하는 각 버스들이 객체가 됩니다. 각 버스들마다 버스 번호, 노선, 운행 시간 정보 등이 설정됩니다. 이는 버스마다 조금씩 다를 수 있겠지요. 이 정보들이 클래스에 정의된 인스턴스 변수 라고 생각하시면 됩니다. 내일부터 인상되는 가격, 모든 버스가 공통적으로 따르며 한 번에 일괄적으로 변경사항이 적용되는 것이 바로 클래스 변수 입니다. 버스 단말기처럼 시스템에서 요금을 인상시키면 내일부터는 카드를 태깅할 때 모든 버스에서 공통적으로 1,200 원을 지불하게 됩니다. 각 버스 기사님이 승객들에게 일일이 "요금 인상" 이라는 안내를 할 필요가 없는 것이죠. 명절을 맞아 버스 요금을 한시적으로 50% 할인할 수도 있습니다. 그러면 클래스 변수인 가격 정보만 50% 할인된 600 원으로 설정하면 끝입니다. 모든 버스를 일일이 확인하여 할인 적용을 할 필요가 없지요. 정리하면, 어떤 정보를 가지고 어떻게 운행을 할지 등이 정의된 것이 클래스이며, 이렇게 정의된 내용에 따라 운행을 하는 각 버스들은 클래스로부터 만들어진 객체입니다. 이때 각 버스별로 내용이 정의되는 곳이 인스턴스 변수이며, 모든 버스에 공통적으로 적용되는 가격은 클래스 변수입니다. 우리가 실제로 코드로 볼 때는 클래스라는 것 하나만 있지만 그 클래스 안에 각각의 객체가 가질 서로 다른 값인 인스턴스 변수를 정의하며, 또한 모든 객체들에 공통적으로 적용되는 클래스 변수를 정의할 수 있습니다. 이때 인스턴스 변수는 객체의 이름으로 접근 하며, 클래스 변수는 클래스의 이름으로 접근 한다는 차이가 있습니다. 질문 주신 내용으로 돌아와서, canAutoReport 는 BlackBox 라는 클래스에 정의된 클래스 변수이므로 클래스명인 BlackBox 로 접근합니다. modelName 은 BlackBox 라는 클래스에 정의된 인스턴스 변수이며 이는 각각의 객체가 서로 다른 값을 가질 수 있으므로 객체의 이름인 b1 으로 접근할 수 있습니다. 설명이 매우 길었는데 차분히 한 번 읽어보시고 클래스와 객체의 차이점, 그리고 인스턴스 변수와 클래스 변수의 차이점을 이해해주시면 좋겠습니다. 😊 감사합니다.
- 0
- 1
- 76
질문&답변
2024.03.05
for 반복문에 대한 질문
안녕하세요? for 반복문에서의 동작 순서는 다음과 같습니다. 1) 선언 2) 조건 확인 3) 수행할 명령 4) 증감 ... 이후 2), 3), 4) 반복 그래서 첫 번째 질문에 대한 답은 "수행할 명령을 먼저" 합니다. for 반복문은 일반적으로 정해진 횟수에 맞춰서 반복을 수행하기 위한 것인데요. 다음과 같이 i 를 0 부터 시작하여 50 보다 작다는 조건을 만족하는 동안 i++ 을 하면서 반복 수행하게 되면, 기본적으로는 50번을 수행하게 됩니다. 이때 i 의 값은 0, 1, 2, 3, ... , 49 까지 총 50개의 값을 순서대로 가지게 되지요. for (int i = 0; i 만약 i 를 1 부터 시작하여 50 보다 작거나 같다는 조건을 만족하는 동안 i++ 을 하면서 반복 수행하게 되면, 똑같이 50번을 수행하게 됩니다. 다만 이때 i 의 값은 1, 2, 3, 4, ... , 50 까지 총 50개의 값을 순서대로 가지게 되고요. for (int i = 1; i 그래서 두 번째 질문에 답을 드리자면, 강의에서와 같이 i 를 1 부터 시작하여 50 보다 작거나 같다는 조건을 만족하는 동안 반복 수행하게 되면, i 의 값은 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 이렇게 바뀌며 1번 손님부터 20번 손님까지 치킨을 판매하게 됩니다. 하지만 질문주신 것처럼 i 를 0 부터 시작하여 50 보다 작다는 조건을 만족하는 동안 반복 수행하게 되면, i 의 값은 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 이렇게 바뀌며 0번 손님부터 19번 손님까지 치킨을 판매하게 됩니다. 즉, 문의주신 내용은 올바른 동작이 맞는 것입니다. 다만 똑같이 20명의 손님에게 치킨을 판매하는 과정에서 첫 번째 손님을 '0번 손님' 부터 시작하느냐 '1번 손님' 부터 시작하느냐의 차이로 이해해주시면 되겠습니다 😊 설명을 천천히 읽어보시고 여전히 이해가 되지 않으신다면 다시 질문 남겨주시면 다른 방법으로 설명드리겠습니다. 감사합니다.
- 1
- 1
- 69
질문&답변
2024.02.27
ArrayList 사이즈 값 초기화
안녕하세요? 유럽불곰 님께서 원하시는 동작은 제가 유추하기로는 다음과 같습니다. init( ) 메소드를 통해 전달받은 heapSize 로 memorySize 를 계산한다 memorySize 를 인스턴스 변수인 heapSize 로 설정한다 heapSize 크기에 맞게 ArrayList memory 를 초기화한다. 하지만 최초 질문주신 소스코드의 동작 순서는 이렇습니다. private int heapSize; // 1. heapSize 인스턴스 변수 선언 (기본값인 0) private ArrayList memory = new ArrayList (heapSize); // 2. memory 리스트 초기화 (이 때 heapSize의 초기값(0)으로 초기화) public void init(int heapSize) { // 3. init 메소드 정의 if (validateInit(heapSize)) { // 4. validateInit 메소드 호출: heapSize 체크 int memorySize = heapSize / BYTE_LENGTH; // 5. memorySize 계산 this.heapSize = memorySize; // 6. heapSize 를 memorySize 로 설정 } else { // 7. heapSize가 유효하지 않은 경우 System.out.println("[ERROR] : 잘못된 값을 입력했습니다."); // 8. 에러 출력 } } 위 코드가 작성되어 있는 클래스로부터 객체가 생성되는 시점에 인스턴스 변수인 heapSize 와 memory 는 이미 만들어집니다. 이때 heapSize 를 별도로 명시하지 않으면 int 변수이므로 0 으로 초기화가 되며, memory 의 capacity 는 heapSize 에 의해 0 으로 초기화가 됩니다. 이 상태에서는 init() 메소드의 동작이 수행되지 않습니다. 그래서 계산을 하는 코드가 있어도 실제로 수행되지는 않아요. 이후에 init() 메소드가 호출이 되더라도 heapSize 값만 업데이트가 될 뿐 memory 는 새롭게 초기화(또는 크기 변경) 가 되지 않아요. 이미 초기화가 되어 있는 상태인 것이죠. 제가 유추한 동작을 원하시는 것이 맞다면 이전 답변에 드린 것처럼 memory 는 선언만 해두고 init() 메소드 내에서 memory 리스트를 초기화해주셔야 합니다. 그래야 init() 메소드가 호출될 때 heapSize 에 의해 계산이 되고 원하는 capacity 에 맞게 memory 리스트가 초기화 될 수 있답니다. capacity 는 데이터를 담을 수 있는 처음 용량입니다. 처음에 10 으로 설정하면 10 개만큼 데이터를 담을 수 있는 용량을 확보하라는 것이죠. 반면에 size 는 현재 담겨 있는 데이터의 개수입니다. 만약 add() 를 통해 3번 데이터를 담았다면 capacity 는 그대로 10 이며, size 는 3 이 됩니다. 여기서는 capacity 와 size 의 차이보다는, 코드의 실행 순서 부분을 숙지하시는 것이 더 우선순위가 높아 보이네요 😊 감사합니다.
- 0
- 2
- 94
질문&답변
2024.02.27
퀴즈 13 질문
안녕하세요? TryWithResources 구문을 사용하지 않고 BufferedWriter 를 사용하실 때에는 필요한 작업을 하고 나서 반드시 close() 를 해주셔야 합니다. try { BufferedWriter bw = new BufferedWriter(new FileWriter("saying.txt")); bw.write("세 살 __ 여든까지 간다"); bw.newLine(); bw.close(); // 꼭 해주세요 } catch (IOException e) { throw new RuntimeException(e); } BufferedWriter 는 데이터를 버퍼에 저장하여 성능을 향상시키는데, 버퍼에 쌓인 데이터는 실제로 파일에 쓰여지기 전까지는 반영이 되지 않을 수 있어요. 이때 close() 메소드를 호출하게 되면 버퍼에 있던 내용이 파일에 쓰여지고, 파일 또한 올바르게 닫혀지므로 write() 또는 newLine() 을 통해 입력한 데이터가 파일에 저장이 된답니다 😊 TryWithResources 에서는 이 동작을 자동으로 해주는 것이죠! 감사합니다.
- 0
- 1
- 108