주말코딩
@weekendcode
수강생
4,770
수강평
580
강의 평점
4.8
안녕하세요. @weekendcode 라는 유튜브 채널을 운영하고 있습니다.
비전공자, 프로그래밍에 관심 있는 학생들을 위해 최대한 쉽게 설명하고자 노력하는 강사입니다.
컴퓨터 공학으로 대학교를 졸업하고, 인간-컴퓨터 상호작용 연구분야로 석사 학위를 받았습니다.
Java 언어로 안드로이드 개발자로서 일했고, Python 강사로 활동했습니다.
몇 번의 이직과 창업을 하는 과정에서 비전공자 분들께 지식을 공유할 기회가 생긴 이후,
본격적으로 지식공유자로 활동하고 있습니다.
모르는 것은 적극적으로 질문 부탁드립니다.
최선을 다해서 답변 드리겠습니다.
좋은 하루 보내세요.
강의
수강평
- (2026) 일주일만에 합격하는 정보처리기사 실기
- (2026) 일주일만에 합격하는 정보처리기사 실기
- (2026) 일주일만에 합격하는 정보처리기사 실기
게시글
질문&답변
유튜브 주말코딩 채널보면서 오늘 인프런 정보처리기사 실기 강의 결제를 하여 섹션1을 들었습니다... ^^;; (이번 정처기 실기 4번째 도전중..)
안녕하세요,얼마나 나이가 있으신 지는 잘 모르겠습니다만제 주변에 30대 후반에 개발을 시작해서 40 초반에 신입으로 일하시는 분도 계십니다.도전 자체만으로도 멋있다고 생각이 드는데, 결과까지도 안겨드리면 좋겠네요. 우선 코드는 부전공하셨으니 C, Java는 문법을 알고 계시리라 생각합니다.하지만 Java는 실제 개발자까지 하지 않으셨다면 업캐스팅이나 기본 Java API까지는 잘 모르실 겁니다. 이런 것들은 어쩔 수 없이 자주 보셔야지 합격이 가능합니다.(저도 Java 언어의 구조나 API를 안드로이드 개발자하면서 익혔으니 단순히 학과 졸업했다고 해서 이해할 수 있다는 것은 무리라고 생각됩니다.) 컴퓨터 이론은 원래 잊어버리기도 하고, 학교에서도 잘 안 알려줍니다.저도 소프트웨어 공학 수업을 듣긴 했는데, 정보처리기사에서 나오는 것들 다시 처음부터 공부했던 기억이 나네요. 먼 미래에 기술사 자격증을 준비하지 않는 한 다시 처음부터 외우기는 영 쉽지 않다는 생각이 들었습니다. 저도 그렇고, 제 주변 분들도 그렇고 이론은 그냥 계속 보고 익숙해지는 것밖에 없다는 생각입니다.안보면 잊어버리는 것이 당연하죠. 제가 영상 앞부분인가에서 말씀드렸는지 모르겠는데,제 주변에 컴퓨터공학과에서 과탑하는 친구들은 지금 네이버, 토스, 카카오에서 일하고 있지만 저보다 C언어를 잘 모릅니다.그도 그럴 것이 저는 오늘도 C언어를 보고 있으니까요. 자주 보고 익숙해지시면 저보다도 훨씬 더 잘하시게 되리라 믿습니다. 응원하겠습니다. 모르는 것이 있으면 질문 올려주세요.팁을 하나 드리자면 질문하시기 전에 온라인에서 각 언어의 컴파일러로 직접 실행해보시고 질문 올리시는 것을 권장드립니다. C: https://www.programiz.com/c-programming/online-compiler/Java : https://www.programiz.com/java-programming/online-compiler/Python : https://www.programiz.com/python-programming/online-compiler/
- 0
- 2
- 21
질문&답변
번외 질문
안녕하세요, 가현님!주신 문장으로만은 질문이 조금 이해가 어렵습니다. 그래서 다시 질문드립니다. int a[3][2]={{1,2}, {3,4}, {5,6}} int *p=a[1]; 라고 되어있고 printf를 할 때 *a와 **a의 차이가 있을까요?여기서 printf에 들어가는 변수 부분 안에 *a, **a 가 들어가면 어떻게 되는지를 물어보시는 걸까요? 제 영상 중 어느 부분에서 질문이 생겼는지도 함께 주시면 답변에 큰 도움이 됩니다.
- 0
- 2
- 19
질문&답변
아 진짜 구조체 이해 안되는데요
안녕하세요, 많이 어려우시죠.아예 코드를 처음 배우시는 분들이라면 C언어 자체가 어려울 수 있습니다.컴퓨터공학과 1학년 때 C언어를 6개월 간 배웠던 저도 그랬고요.옆에서 붙어서 과외처럼 가르쳐주지 않는 한, 원래 어려운 것이 맞습니다. 우선 문법은 둘째치고,개념 자체가 어려우신 것 같습니다.첫번째는 포인터 개념이고 두번째는 "함수를 호출한다"라는 개념입니다.8:14에 나온 코드 기준으로 좀 더 구체적으로 설명해볼게요.#include #include // 구조체 정의 struct Bag { char brand[50]; // 브랜드명을 저장할 문자열 배열 int year; // 제작 연도를 저장할 정수형 변수 float price; // 가격을 저장할 실수형 변수 }; // 구조체 포인터를 인수로 받아서 출력하는 함수 정의 void printBag(struct Bag * bag) { printf("Brand: %s\n", bag -> brand); printf("Year: %d\n", bag -> year); printf("Price: %.2f\n", bag -> price); } int main() { struct Bag myBag; // 구조체 변수 선언 struct Bag * bagPtr = & myBag; // 구조체 포인터 선언 및 초기화 // 포인터를 통해 값 할당 strcpy(bagPtr -> brand, "Gucci"); bagPtr -> year = 2021; bagPtr -> price = 1500.50; printBag(bagPtr); // 구조체 포인터를 사용하여 함수 호출 return 0; }
- 0
- 3
- 24
질문&답변
6분 40초 질문
안녕하세요, 질문 많이 하셔도 괜찮습니다.다만 제가 바로바로 답변할 수 있을 지가 걱정이네요. 핵심: A b는 class B로 "되는" 게 아닙니다.A b = new B();를 풀어서 설명하면:A b = new B(); //↑ ↑ ↑ ↑ //│ │ │ └─ B 클래스의 기본 생성자 호출 //│ │ └───── 새로운 객체 생성 //│ └───────── 변수명 (소문자 b) //└─────────── 변수의 타입 (클래스 A) 1. 대소문자 구분A, B (대문자) = 클래스 이름b (소문자) = 변수 이름Java는 대소문자를 엄격히 구분합니다. b와 B는 완전히 다른 것입니다. A b = new B(); 이 문장은 아래와 같이 이해해야합니다.실제 생성되는 객체: B 타입 (자식)변수 b의 타입: A 타입 (부모)의미: "B 객체를 만들었지만, A 타입 변수로 참조하겠다" 2. 왜 이렇게 쓸까요?// 예시 class Animal { // 부모 void sound() { System.out.println("..."); } } class Dog extends Animal { // 자식 void sound() { System.out.println("멍멍"); } } class Cat extends Animal { // 자식 void sound() { System.out.println("야옹"); } } // 사용 Animal pet1 = new Dog(); // Dog 객체를 Animal 타입으로 Animal pet2 = new Cat(); // Cat 객체를 Animal 타입으로 pet1.sound(); // "멍멍" 출력 (실제는 Dog) pet2.sound(); // "야옹" 출력 (실제는 Cat)이렇게 하면 다양한 자식 객체들을 부모 타입 하나로 관리할 수 있습니다. 3. 주의사항A b = new B(); b.메서드(); // A에 있는 메서드만 호출 가능 // B에만 있는 메서드는 호출 불가변수 타입이 A이므로, A에 정의된 메서드만 사용할 수 있습니다.(단, 오버라이딩된 메서드는 B의 구현이 실행됨)핵심 요약: A b = new B();는 "B 객체를 만들어서 A 타입 변수로 가리킨다"는 의미입니다.
- 0
- 2
- 23
질문&답변
섹션 3. 17강. 23:00 질문 있습니다.
printf("입력된 문자열: %c\n", str)%c는 문자 그 자체를 출력하는 포맷이고, 주소가 오면 안됩니다.배열의 이름 그 자체는 배열의 시작 주소를 가집니다. str은 뜯어보면 메모리 주소라는 것이죠. 그래서 결론적으로는 오류가 발생합니다.그런 코드는 시험 문제에서 출제되지 않습니다.#include int main() { char str[] = "this is string"; printf("=== 1. %%s와 %%c의 차이 ===\n"); printf("%%s로 출력: %s\n", str); printf("%%c로 출력: %c\n", str); // ⚠️ 경고 발생! 이상한 문자 출력됨 printf("\n"); printf("=== 2. 올바른 %%c 사용법 ===\n"); printf("첫 번째 문자만 출력: %c\n", str[0]); // 't' 출력 printf("두 번째 문자만 출력: %c\n", str[1]); // 'h' 출력 printf("\n"); printf("=== 3. 메모리 주소 확인 ===\n"); printf("배열 이름(첫 번째 요소 주소): %p\n", str); printf("str[0]의 주소: %p\n", &str[0]); printf("str[1]의 주소: %p\n", &str[1]); printf("str[2]의 주소: %p\n", &str[2]); printf("str[3]의 주소: %p\n", &str[3]); printf("\n"); printf("=== 4. 각 문자 값과 주소 출력 ===\n"); for (int i = 0; str[i] != '\0'; i++) { printf("str[%d] = '%c', 주소: %p\n", i, str[i], &str[i]); } printf("\n"); printf("=== 5. 주소 차이 확인 ===\n"); printf("str[0]과 str[1]의 주소 차이: %ld 바이트\n", (long)(&str[1] - &str[0])); return 0; } 온라인 컴파일러 기준으로 아래 출력문이 나옵니다.메모리 주소는 환경에 따라 다르게 나오니까 무시하시고, 값만 보시면 됩니다.=== 1. %s와 %c의 차이 === %s로 출력: this is string %c로 출력: � === 2. 올바른 %c 사용법 === 첫 번째 문자만 출력: t 두 번째 문자만 출력: h === 3. 메모리 주소 확인 === 배열 이름(첫 번째 요소 주소): 0x7ffdca154b9d str[0]의 주소: 0x7ffdca154b9d str[1]의 주소: 0x7ffdca154b9e str[2]의 주소: 0x7ffdca154b9f str[3]의 주소: 0x7ffdca154ba0 === 4. 각 문자 값과 주소 출력 === str[0] = 't', 주소: 0x7ffdca154b9d str[1] = 'h', 주소: 0x7ffdca154b9e str[2] = 'i', 주소: 0x7ffdca154b9f str[3] = 's', 주소: 0x7ffdca154ba0 str[4] = ' ', 주소: 0x7ffdca154ba1 str[5] = 'i', 주소: 0x7ffdca154ba2 str[6] = 's', 주소: 0x7ffdca154ba3 str[7] = ' ', 주소: 0x7ffdca154ba4 str[8] = 's', 주소: 0x7ffdca154ba5 str[9] = 't', 주소: 0x7ffdca154ba6 str[10] = 'r', 주소: 0x7ffdca154ba7 str[11] = 'i', 주소: 0x7ffdca154ba8 str[12] = 'n', 주소: 0x7ffdca154ba9 str[13] = 'g', 주소: 0x7ffdca154baa === 5. 주소 차이 확인 === str[0]과 str[1]의 주소 차이: 1 바이트
- 0
- 2
- 19
질문&답변
28강 케이스6. (6분대 질문)
질문이 조금 난해합니다.class Parent() ← 이렇게 기본 생성자를 호출하지는 않습니다.코드로 표현하기 어려우시면, 어디 부분에 어떻게 쓰고 싶은 지를 말로 풀어서 설명해주시면 좋습니다. 혹시 기존의 super()를 super("name")으로 쓴다고 해석하면 될까요?그러면 가능하긴 합니다. class Parent { private String name; // 매개변수가 있는 생성자만 정의 public Parent(String name) { this.name = name; System.out.println("테스트"); } } class Child extends Parent { public Child() { // 컴파일 에러 발생: 부모 클래스의 기본 생성자가 없기 때문에 super() 호출이 실패함 super("name"); // 자동으로 추가되는 부모 클래스 생성자 호출 코드. 여기서 오류발생 } } public class Main { public static void main(String[] args) { Child child = new Child(); // 컴파일 에러 발생 } }출력값: 테스트
- 0
- 2
- 23
질문&답변
29강 전체적인 질문
안녕하세요, 우선 2가지를 구별하셔야 합니다.큰따옴표(" ")로 감싼 것: 문자열(String) - 그대로 출력됨변수나 식: 그 값이 계산되어 출력됨 첫 번째는 "" 입니다.Java에서 큰 따옴표로 감싼 것은 문자들을 합친 '문자열'이라고 부릅니다.그냥 우리가 평소에 쓰는 텍스트의 의미를 가진 데이터 타입입니다.System.out.println()은 하나의 값을 받아서 출력하는 함수입니다.하나의 값이라는 것은, 전체의 값을 하나로 만들어야 한다는 뜻이죠. Java에서는 문자열이 하나라도 포함된 상태에서 + (덧셈)을 하면 나머지도 연결해버립니다.숫자든 boolean 값이든 문자열처럼 합쳐버리죠.System.out.println("나이: " + 25); // 나이: 25 System.out.println("결과: " + true); // 결과: true System.out.println("점수: " + 95.5); // 점수: 95.5 System.out.println(100 + "원"); // 100원 System.out.println("합계: " + 10 + 20); // 합계: 1020 (주의!) System.out.println("합계: " + (10 + 20)); // 합계: 30 (올바른 방법) 두 번째는 연산자입니다.==이라는 앞뒤를 비교해서 true인지 false인지를 리턴합니다.System.out.println("안녕하세요"); // 안녕하세요 출력 System.out.println(5 + 3); // 8 출력 System.out.println(d1 == d2); // true 또는 false 출력 요약하자면, 위에서 설명드린 것처럼뒤의 ==으로 비교하는 것은 true 혹은 false가 나오고앞은 문자열이기 때문에, 출력 그 자체는 두 가지를 연결된 값이 출력되는 것입니다. ⛔ 주의 하실 것은, 숫자끼리 더하면 실제 덧셈이 됩니다.❗int a = 5; int b = 3; System.out.println(a + b); // 8 (덧셈) double x = 3.5; double y = 2.1; System.out.println(x + y); // 5.6 (덧셈) // 다른 숫자 타입끼리도 가능 int num1 = 10; double num2 = 5.5; System.out.println(num1 + num2); // 15.5 (int가 double로 자동 변환) 덧붙여서, 노베이스 환영합니다. 많은 노베이스 분들도 합격하셨습니다.
- 0
- 2
- 21
질문&답변
33강 10분 질문
질문에 super()가 아니라 super(model, year)를 뜻하는 것이죠? super()는 부모의 기본 생성자를 뜻합니다. Q. new ElectricCar("Tesla",2021,75);라는 변수가 있기 때문에 자식 기본 생성자인 부분은 건너뛰고 2번째인 ElectricCar(String model, int year, int batteryCapacity)로 바로 넘어가는 건가요?네 맞습니다. new라는 것 자체가 생성자를 부르라는 뜻입니다. 지금 new 뒤에 파라미터 3개짜리 (파라미터는 개수만 보는 게 아니라 타입도 보셔야 해요)를 부르고 있죠? 그래서 3개짜리 생성자가 호출됩니다.Q. 이후에 부모 기본생성자 출력하고 남은 Capacity를 출력하는 순서... 이렇게 이해하면 되는건가요?"이후에"가 아닙니다. 부모의 생성자는 무조건 자식보다 먼저 실행되어야 합니다. 그래서 지금 답을 보시면 Car()로 나오죠? 부모의 기본 생성자로 부모의 필드를 먼저 초기화되어야 자식이 태어날 수 있습니다!
- 0
- 2
- 17
질문&답변
약 9분쯤 질문 있습니다.
안녕하세요!super라는 것 자체가 부모의 생성자를 부르는 것입니다.기본 생성자라는 것은 파라미터가 없는 생성자를 일컫는 것이죠. 생성자를 부르는데 파라미터가 들어가있다면? 당연히 부모의 기본 생성자가 아닌 다른 부모 생성자를 부르는 것입니다. super() 그 자체는 부모의 기본 생성자만 부르는 것입니다.자식의 기본 생성자가 출력될지 아닐지는 최초의 main 함수에서 어떻게 불리는 지에 따라 달라집니다.단순히 저 질문으로는 답변이 어렵습니다.
- 0
- 2
- 23
질문&답변
6분 20초 질문.
기본형과 래퍼형을 비교하면 true가 나와야 합니다.public class DoubleComparison { public static void main(String[] args) { // 기본형 double double d1 = 3.14; double d2 = 3.14; // 래퍼 클래스 Double Double D1 = 3.14; Double D2 = 3.14; Double D3 = new Double(3.14); // 1. 기본형 비교 System.out.println("d1 == d2: " + (d1 == d2)); // true // 2. 래퍼 클래스 비교 System.out.println("D1 == D2: " + (D1 == D2)); // false System.out.println("D1.equals(D2): " + D1.equals(D2)); // true // 3. 기본형과 래퍼 클래스 비교 System.out.println("d1 == D1: " + (d1 == D1)); // true // 4. new로 생성한 객체 비교 System.out.println("D1 == D3: " + (D1 == D3)); // false System.out.println("D1.equals(D3): " + D1.equals(D3)); // true } } 출력결과는 이렇습니다.d1 == d2: true D1 == D2: false D1.equals(D2): true d1 == D1: true D1 == D3: false D1.equals(D3): true 이건 그냥 외우는 것이 좋습니다.하나는 클래스를 통해서 파생되는 객체로,다른 하나는 자바에서 제공하는 기본적인 데이터 타입이라고 알고 계시면 되는데어떤 경우에 같고 어떤 경우에 다른지는 그냥 암기하시는 것이 편합니다. 정리하면, 소문자와 대문자를 ==하면 true로 나온다는 것입니다.
- 0
- 2
- 26




