소개
유튜브에서 코딩 교육 채널을 운영하고 있는 나도코딩입니다.
누구나 쉽고 재미있게 코딩을 공부하실 수 있도록 친절한 설명과 쉬운 예제로 강의합니다.
코딩, 함께 하실래요? 😊
🧡 유튜브 나도코딩
🎁 코딩 자율학습 나도코딩의 파이썬 입문
📚 코딩 자율학습 나도코딩의 C 언어 입문
강의
전체11로드맵
전체1수강평
- 감사합니다
차명준
2024.03.25
0
- 굳굳굳굳굳
조문영
2024.03.25
0
- 좋은 강의 고맙습니다.
정병선
2024.03.20
0
게시글
질문&답변
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
- 46
질문&답변
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
- 45
질문&답변
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번 손님' 부터 시작하느냐의 차이로 이해해주시면 되겠습니다 😊 설명을 천천히 읽어보시고 여전히 이해가 되지 않으신다면 다시 질문 남겨주시면 다른 방법으로 설명드리겠습니다. 감사합니다.
- 0
- 1
- 52
질문&답변
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
- 76
질문&답변
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
- 69