본문 바로가기

멋쟁이 사자처럼 BE School

[멋쟁이사자처럼 Back-End School 1기] Day 14. C언어, JAVA, TDD

C언어

💡 0의 의미

  • ‘\0’ : 문자로써의 0
  • 0 : 숫자로써의 0
  • null : 포인터로써의 0
  •  

Chapter 26

문제 1. 문장의 길이를 반환하는 함수 생성

// Chapter 26 Problem 1
#include <stdio.h>

// 문제 : 문장의 길이를 반환하는 함수를 만들어주세요.(get_str_len)
int get_str_len(char* str) {
    int len = 0;

    while (true) {
        if(str[len] == NULL) { // '\\0' = NULL
            return len;
        }
        len++;
    }
}

int main(void) {
  char name[100] = "Paul"; // name 배열에 Paul 설정
  int len = get_str_len(name);

  printf("len : %d\\n", len);
  // 출력 => len : 4

  name[0] = 't';
  name[1] = 'o';
  name[2] = 'm';
  name[3] = 'a';
  name[4] = 's';
  name[5] = '\\0';

  len = get_str_len(name);

  printf("len : %d\\n", len);
  // 출력 => len : 5

  return 0;
}

문제 2. 문장에서 특정 문자의 위치를 반환하는 함수 생성

// Chapter 26 Problem 2
// 문제 : 문장에서 특정 문자의 위치를 반환하는 함수를 만들어주세요.(get_index_of_c)

#include <stdio.h>

int get_index_of_c (char* str, char c ) {
    for ( int i = 0; str[i] != '\\0'; i++ ) { // null 값이 나올 때 까지 진행
        if ( str[i] == c ) {  // 만약 문자열 중 해당 문자와 같다면
            return i; // 해당 index 반환
        }
    }
    return -1; // 없다면 -1 반환
}

int main(void) {
  int index;
    
  index = get_index_of_c("abc", 'b');
  printf("index : %d\\n", index);
  // 출력 => index : 1
  
  index = get_index_of_c("test", 's');
  printf("index : %d\\n", index);
  // 출력 => index : 2
  
  index = get_index_of_c("test", 'x');
  printf("index : %d\\n", index);
  // 출력 => index : -1
  
  return 0;
}

강사님 문제. 문자열과 문자열을 비교하여 시작 index 출력

💡 strstr : 문자열 안에서 문자열을 검색 풀이

  1. 문자열끼리 비교 후 있으면 진행, 없으면 -1 반환
  2. 두 문자열을 비교하고, return을 사용하여 첫 번째로 같은 부분의 index 반환

    +counting으로 순차적인 문자열인지 확인하여 출력할 수 있는 알고리즘 구현해보기
#include <stdio.h>

int get_index_of_word(char* str, char* c) {
    for ( int i = 0; str[i] != '\\0'; i++ ) {
        for (int j = 0; c[j] != '\\0'; j++) {
            if ( strstr(str, c) != NULL ) {
                if (str[i] == c[j]) {
                    return i;
                }
            }  
        }  
    }
    return -1; 
}

int main(void) {
  int index;
    
  index = get_index_of_word("abcd", "b");
  printf("index : %d\\n", index);
  
  index = get_index_of_word("abcd", "bc");
  printf("index : %d\\n", index);
  
  index = get_index_of_word("abcd", "bcd");
  printf("index : %d\\n", index);

  index = get_index_of_word("abcd", "bd");
  printf("index : %d\\n", index);

  index = get_index_of_word("abcd", "abcd");
  printf("index : %d\\n", index);

  index = get_index_of_word("abcd", "d");
  printf("index : %d\\n", index);
  
  return 0;
}

문제 3. 문장에서 특정 부분만 잘라서 출력하는 함수 생성

// Chapter 26 Problem 3
// 문제 : 문장에서 특정 부분만 잘라서 출력하는 함수를 만들어주세요.(print_sub_str)

#include <stdio.h>

void print_sub_str(char* c, int a, int b) {
    for (int i = a; i < a + b; i++) { // 지정한 시작점부터 총 길이까지
        if (c[i] == '\\0') { // 3번째 문항에서 3번째 인자가 10 이므로 멈춰주는 조건 진행
            break;
        }
        printf("%c", c[i]);
    }
    printf("\\n");
}

int main(void) {
  print_sub_str("abcd", 2, 2);
  // 출력 => cd

  print_sub_str("abcd", 1, 3);
  // 출력 => bcd

  print_sub_str("abcd", 1, 10);
  // 출력 => bcd

  print_sub_str("abcd", 0, 2);
  // 출력 => ab

  return 0;
}

Java

Chapter 14. 생성자

문제 1. 플레이어가 어떤 공격을 할지 플레이어 직업에 따라 다르게 출력

💡 메소드 오버라이딩
      -
상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시
         정의하는 것

      애너테이션
      -
프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것

 

public class c14p1 {
    public static void main(String[] args) {
        캐릭터 a플레이어_캐릭터;

        a플레이어_캐릭터 = new 전사();
        a플레이어_캐릭터.공격();
        // 출력 : 전사가 대검으로 공격합니다.

        a플레이어_캐릭터 = new 마법사();
        a플레이어_캐릭터.공격();
        // 출력 : 마법사가 파이어볼로 공격합니다.
    }
}

class 캐릭터 {
    void 공격() {
        System.out.println("공격!");
    }
}

class 전사 extends 캐릭터 {
    @Override // 오버라이드 애너테이션
    void 공격() {
        System.out.println("전사가 대검으로 공격합니다.");
    }
}

class 마법사 extends 캐릭터 {
    @Override
    void 공격() {
        System.out.println("마법사가 파이어볼로 공격합니다.");
    }
}

문제 2. 생성자를 사용해 전사의 기본 이름을 No Name으로 지정

💡 생성자

  • new 연산자를 통해 인스턴스를 생성할 때 반드시 호출되고, 가장 먼저 실행되는 일종의 메소드
  • 하지만 메소드X
  • Default 값 지정
public class c14p2 {
    public static void main(String[] args) {
        전사2 a전사0 = new 전사2();
        a전사0.나이 = 20;
        a전사0.이름 = "칸"; // 이름 지정
        a전사0.성격 = "차가움";
        a전사0.a무기 = new 활();

        전사2 a전사1 = new 전사2();
        전사2 a전사2 = new 전사2();
        전사2 a전사3 = new 전사2();
        전사2 a전사4 = new 전사2();
        전사2 a전사5 = new 전사2();

        System.out.println(a전사0.이름);
        // 출력 : 칸
        System.out.println(a전사1.이름);
        // 출력 : No Name
        System.out.println(a전사2.이름);
        // 출력 : No Name
        System.out.println(a전사3.이름);
        // 출력 : No Name
        System.out.println(a전사4.이름);
        // 출력 : No Name
        System.out.println(a전사5.이름);
        // 출력 : No Name
    }
}

class 전사2 {
    int 나이;
    String 이름;
    String 성격;
    무기 a무기;
    전사2() { // 생성자
       이름 = "No Name";
    }
}

class 무기 {

}

class 활 extends 무기 {

}

문제 3. 팔을 생성할 때 자동으로 길이 세팅

public class c14p3 {
    public static void main(String[] args) {
        사람 a사람 = new 사람();
        a사람.나이 = 10;
        a사람.a왼팔 = new 팔();

        System.out.println(a사람.a왼팔.길이 + "cm");
        // 출력 : 100cm
    }
}

class 사람 {
    int 나이;
    팔 a왼팔;
}

class 팔 {
    int 길이;

    팔() { // 생성자를 사용하여 팔의 길이 지정
        길이 = 100;
    }
}

문제 4. 사람이 생성할 때 자동으로 a왼팔 변수에 팔 객체가 연결되도록

public class c14p4 {
    public static void main(String[] args) {
        new 사람().걷다();

        System.out.println(new 사람().a왼팔.길이 + "cm");
        // 출력 : 100cm
    }
}
class 사람 {
    팔 a왼팔;

    사람() {
        a왼팔 = new 팔(); // a왼팔 변수를 팔 객체로 연결
    }
    void 걷다() {
        System.out.println("사람 걷는다.");
    }
}

class 팔 {
    int 길이;

    팔() {
        길이 = 100;
    }
}

문제 5. this의 역할

💡 this

  • 인스턴스 자신을 가리키는 키워드
  • 클래스 메소드의 매개변수와 멤버변수의 식별자(변수이름)이 겹치는 경우가 발생할 때 유용

문제 6. 사람을 만들 때 왼팔과 손과 엄지손가락이 한번에 만들어질 수 있도록

// 생성자 갯수 제한 X
public class c14p6 {
    public static void main(String[] args) {
        int 엄지손가락_길이 = new 사람().a왼팔.a손.a엄지손가락.길이;

        System.out.println(엄지손가락_길이 + "cm");
        // 출력 : 5cm
    }
}

class 사람 {
    팔 a왼팔;

    사람() {
        a왼팔 = new 팔();
    }
}

class 팔 {
    손 a손;

    팔() {
        a손 = new 손();
    }
}

class 손 {
    손가락 a엄지손가락;

    손() {
        a엄지손가락 = new 손가락();
    }
}

class 손가락 {
    int 길이;

    손가락() {
        길이 = 5;
    }
}

문제 7. 문제 6의 생성자 갯수 3개로 제한

public class c14p7 {
    public static void main(String[] args) {
        int 엄지손가락_길이 = new 사람().a왼팔.a손.a엄지손가락.길이;

        System.out.println(엄지손가락_길이 + "cm");
        // 출력 : 5cm
    }
}

class 사람 {
    팔 a왼팔;

    사람() {
        a왼팔 = new 팔();
    }
}

class 팔 {
    손 a손;

    팔() {
        a손 = new 손();
    }
}

class 손 {
    손가락 a엄지손가락;

    손() {
        a엄지손가락 = new 손가락();
        a엄지손가락.길이 = 5;
    }
}

class 손가락 {
    int 길이;
}

문제 8. 문제 6의 생성자 갯수 1개로 제한

public class c14p8 {
    public static void main(String[] args) {
        int 엄지손가락_길이 = new 사람5().a왼팔.a손.a엄지손가락.길이;

        System.out.println(엄지손가락_길이 + "cm");
        // 출력 : 5cm
    }
}

class 사람5 {
    팔5 a왼팔;

    사람5() { // 생성자
        a왼팔 = new 팔5();
        a왼팔.a손 = new 손5();
        a왼팔.a손.a엄지손가락 = new 손가락5();
        a왼팔.a손.a엄지손가락.길이 = 5;
    }
}

class 팔5 {
    손5 a손;
}

class 손5 {
    손가락5 a엄지손가락;
}

class 손가락5 {
    int 길이;
}

메소드 오버로딩

💡 ● 같은 이름의 메소드를 중복하여 정의하는 것
     ● 매개변수의 개수와 타입을 변경하여 설정

public class MethodOverloading {
    public static void main(String[] args) {
        Test t = new Test();
        t.something();
        t.something(10);
        t.something(10,10);
        t.something(10,10.1);
    }
    void something() {
        System.out.println("something!");
    }
    void something(int i) {
        System.out.println(i);
    }
    void something(int i, int i2) {
        System.out.println(i+i2);
    }
    void something(int i, double d) {
        System.out.println(i+d);
    }
}

TDD 구현

 

 

후기 : 재밌다 시간가는줄 모르겠다 너무 재미있어서 막 더 해보고싶다!!!!