본문 바로가기

멋쟁이 사자처럼 BE School

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

C언어

배열

  • 사용 이유
    - 관련된 데이터 모음
    - 변수 1개로 공간 여러개를 컨트롤 할 수 있다.
    -- 배열은 스택 안에 해당 배열의 크기만큼 들어갈 수 있는 공간을 차지한다.
  • 자료형의 크기 * 배열의 수 만큼 공간을 차지한다
    - int a[10] = 총 40byte(int a : 4byte * 10)

 

  • 포인터
#include <stdio.h>

int main(void) {
  int a9, a8, a7, a6, a5, a4, a3, a2, a1, a0;

  a0 = -10;
  a1 = 10;
  a2 = 100;
  a3 = 210;
  a4 = 322210;
  a5 = 1440;
  a6 = 1130;
  a7 = 33210;
  a8 = 1210;
  a9 = 33210;

  int max_number = 0;

  for (int i = 0; i < 10; i++) {
    int num = *(&a0 + i); // pointer 사용하여 int num의 값을 가져온다.
    if (num > max_number) {
      max_number = num;
    }
  }

  printf("최대값은 %d 입니다.\\n", max_number);

  return 0;
}
  • 배열 내 포인터
#include <stdio.h>

int main(void) {
  int a[10]; // 40

  a[0] = -10;
  a[1] = 10;
  a[2] = 100;
  a[3] = 210;
  a[4] = 310;
  a[5] = 1440;
  a[6] = 1130;
  a[7] = 333210;
  a[8] = 1210;
  a[9] = 33210;

  int max_number = 0;

  for ( int i = 0; i < 10; i++ ) {
    int current_num = *(a + i); // 배열 내 i만큼 이동
    if ( current_num > max_number ) {
      max_number = current_num;
    }
  }

  printf("최대값은 %d 입니다.\\n", max_number);

  return 0;
}

// 배열 내 다음 칸으로 이동하고 싶을 경우
// *(arr + i) 사용

#include <stdio.h>

int main() {
  int arr[2];

  *arr = 10;
  *(arr + 1) = 20; // int arr의 다음칸으로 넘어간다.
  
  printf("arr[0] : %d\\n", arr[0]);
  printf("arr[1] : %d\\n", arr[1]);

  return 0;
}

Java

  • 자바의 변수 설정 후 초기화를 하지 않아 나오는 쓰레기 값은 출력되지 않는다.
int x;
System.out.println(x); // 출력되지 않음

int x = 10;
System.out.println(x); // 10 출력
  • 클래스로 할 수 있는 것
    - 객체 생성 // new 사람();
    - 리모콘 생성 // new 사람();
    - 리모콘 변수 생성 // 사람 a사람;
  • 메소드로 할 수 있는 2가지
    - 객체를 만들 때 → 실제로 활용할 수 있는 기능 생성
    - 리모콘을 만들 때 → 버튼을 만들 때 사용
  • 상속
    - 중복을 제거하기 위한 방법
       → 자바에서는 중복을 나쁘게 생각한다.
    - A is B 관계 ( is == extends)
    - 상속은 모든 자식 메소드를 만족시킬 수 없다.
class TDuck extends Duck {
  - 상속 시 부모 / 자식 클래스로 구분한다.(자식은 부모클래스의 기능을 받아온다.)
class Duck {
    void fly() {
        System.out.println("오리 날다");
    }

    void swim() {
        System.out.println("헤엄치는 중");
    }
}

class TDuck extends Duck { // TDuck is Duck -> Duck 클래스(부모)의 fly와 swim 기능 사용 가능)
//    void fly() {
//        System.out.println("오리 날다");
//    }
    // Duck class를 상속하여 fly의 중복을 삭제
}
  - 상속만으로 복잡한 중복을 해결할 수 없다
       → 구성을 배워야 한다.

  - 다중 상속은 불가능
class TDuck extends Duck, RDuck { // 다중 상속(X) -> 누가 우선순위인지 모름
  - 소프트웨어의 객체지향 기법, 좋은 설계기법, 디자인 패턴 등은 오직 중복 소스코드를 합리적으           

    로 없애기 위해서 존재한다.

💡   ❗중복이 안좋은 이유

- 나중에 변경사항이 생길 때, 변경해야 할 곳이 많아진다.

- 중복이 많은 코드는 쉬운코드이다.(1차원)

 

  • 전체코드
class Duck {
    void fly() {
        System.out.println("오리 날다");
    }

    void swim() {
        System.out.println("헤엄치는 중");
    }
}

class TDuck extends Duck { // TDuck is Duck
//    void fly() {
//        System.out.println("오리 날다");
//    }
    // Duck class를 상속하여 fly의 중복을 삭제
}

//D2 요구
class WDuck extends Duck { // WDuck is Duck
//    void fly() {
//        System.out.println("오리 날다");
//    }
    // Duck class를 상속하여 fly의 중복을 삭제
}

// RDuck의 method는 총 3개(fly, swim, override fly)
class RDuck extends Duck { // 상속을 해도 fly라는 method는 따로 실행할 수 있다.
    // method override : 상속받은 메소드를 다시 구현
    void fly() {
        System.out.println("나는 못난다");
    }
    // method override
    void swim() {
        System.out.println("물에 둥둥 뜸");
    }
}

//
class RDuck2 extends RDuck { // 상속으로 override된 RDuck의 method 실행
    // method override : 상속받은 메소드를 다시 구현
    // void fly() {
    //   System.out.println("나는 못난다");
    // {
}

class Main {
    public static void main(String[] args) {
        TDuck aduck = new TDuck();
        WDuck bduck = new WDuck();
        RDuck cduck = new RDuck();
        RDuck2 dduck = new RDuck2();
        aduck.fly();
        bduck.fly();
        cduck.fly();
        dduck.fly();
    }
}

여러 메소드 사용

public class Method {
    public static void main(String[] args) {
        Calculator cal = new Calculator();
        // 계산기.더한결과를_화면에_출력(10, 20);
        cal.sum(10, 20);
        // 출력 => 결과 : 30

        // 계산기.더한결과를_화면에_출력(50, 20);
        cal.sum(50, 20);
        // 출력 => 결과 : 70

        // 계산기.뺀결과를_화면에_출력(50, 20);
        cal.div(50, 20);
        // 출력 => 결과 : 30

        // 계산기.뺀결과를_화면에_출력(5, 2);
        cal.div(5, 2);
        // 출력 => 결과 : 3

        //계산기.곱한결과를_화면에_출력(5, 2);
        cal.mul(5, 2);
        // 출력 => 결과 : 10
    }
}

class Calculator {
    void sum(int a, int b) { // 덧셈 메소드
        System.out.println(a + b);
    }

    void div(int a, int b) { // 뺄셈 메소드
        System.out.println(a - b);
    }

    void mul(int a, int b) { // 곱셈 메소드
        System.out.println(a * b);
    }
}

캐스팅

  • 타입을 변환하는 것
  • UpCasting : 자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것
  • DownCasting : 부모 클래스의 객체가 자식 클래스 타입으로 형변환 되는 것
class Main {
    public static void main(String[] args) {
        // Weapon 변수에는 Weapon 리모콘이 들어간다.
        // Knife는 Weapon으로 형변환 (Knife 리모콘이 Weapon 리모콘으로 변환)
        Weapon aweapon = new Knife(); // UpCasting
        aweapon = new bow();
        aweapon.attack();
    }
}

class Weapon {
    void attack() {
        System.out.println("칼로 공격");
    }
}

💡 해당 class에서의 메소드가 실행되지 않는 이유
- weapon이라는 객체 리모콘에는 attack이라는 버튼이 없다.
- knife라는 객체 리모콘에 attack이라는 버튼이 있다.
- aweapon은 weapon이라는 객체 리모콘을 가지고 있고, attack이라는 버튼을 사용할 수 없다.
- knife는 weapon의 버튼을 사용할 수 있는 것 뿐이지, weapon은 knife의 버튼을 사용할 수 없다
  -> knife라는 객체는 weapon의 리모콘을 복제한 것 뿐이다.
- aweapon은 Weapon 리모콘만 가지고 있다.(Knife의 버튼이 아닌 Weapon의 버튼만 있다.)
  -> UpCasting으로 인해 부모의 리모콘만 가지고 있다.
class Knife extends Weapon {
		void attack() {
        System.out.println("칼로 공격");
		}
}

class bow extends Knife { }

 

 

후기 : 항상 파이썬만 해오던 나는 자바를 익히는데 조금 어려운 느낌이 든다. 2학년 때 배웠던 것을 지금 하려고 하니 굉장히 어려운데.. 왜이렇게 모르는게 많은지 모르겠다.. 미리 자바 시작해둘걸 후횐된다. 조금 더 열심히 해보자 재순