본문 바로가기

멋쟁이 사자처럼 BE School

[멋쟁이사자처럼 Back-End School 1기] Day 7. 컴퓨터 공학, 포인터, Java

컴퓨터 공학

CPU구조

  • Control Unit : 매니저
  • ALU : 계산
  • Register : 기억
  • L3 < L2 < L1 < Register, 속도 오름차순)

레지스터의 종류

  • 프로그램 카운터 : 현재 실행중인 소스코드 라인의 위치 기억
    → 순차적으로 샐행된다.
  • 명령어 레지스터 : 현재 실행중인 명령어를 실질적으로 가져온다.
  • 메모리 주소 레지스터 : 목표(타겟)
  • 메모리 데이터 레지스터 : 타겟에서 가져온 데이터 or 타겟에 넣을 데이터(결과, 복사본)
  • 어큐뮬레이터 : 계산값

정보의 단위

  • 정보 : 데이터 + 처리
  • bit : 정보의 기본 단위
  • 워드 : CPU 레지스터 단위
  • 16bit CPU의 워드 : 16bit
  • 32bit CPU의 워드 : 16bit
    → CPU의 1워드 만큼 레지스터에서 메모리 주소 사용

❗ 32bit CPU에서는 RAM을 4GB 이상 사용할 수 없다?

  • 1워드 = 32bit 이므로 2^32인 0 ~ 42억 까지 저장 가능

= CPU는 일꾼을 시켜 RAM에서 주소 레지스터에 대한 데이터를 가져오는데, 32bit CPU에는 최대 42억까지 주소 레지스터에 저장할 수 있어 RAM의 모든 용량(0 ~ 85억)이 아닌 4GB(0 ~ 42억)까지 사용할 수 있다.

C언어

변수와 메모리

  • PC를 관리하는 소프트웨어 : 운영체제(OS)
  • OS가 메모리를 관리한다.
  • C프로그램은 운영체제의 관리하에 실행된다.
    → 프로그램은 운영체제에 메모리를 구걸하여 할당(변수는 메모리에 할당된다.)
  • 메모리는 크게 2개 구역으로 나뉜다.
  • Heap : 객체가 있는 구역. 위 → 아래
  • Stack : 지역변수가 있는 구역. 아래 → 위
  • sizeOf(변수 or 자료형) : 해당 자료형의 크기(byte 단위) 출력
  • 정수형
    - 참고 : https://blog.naver.com/kji9653/221913097313
    - unsigned : 부호를 없애 표현
      ex) short : -32768 ~ 32767 까지 표현 가능
            unsigned short : 0 ~ 65535 까지 표현 가능
  • 실수형
    참고 : https://m.blog.naver.com/kji9653/221915460675
  • 포인터
    - 참고 : https://blog.naver.com/linuxdude/120004505419
    - 메모리는 항상 부족하다 → 모든 최적화, 모든 기교는 메모리를 최대한 효율적으로 사용하도록 발전
  • 스택
    - 지역변수는 스택에 저장한다.(method parameter도 스택에 저장)
    - FILO(First In Last Out) 구조
    ❗스택으로 쌓는 이유
      - 낭비되는 메모리를 최소화 하기 위해


  • - 완전 이진트리의 일종
    - 객체를 저장하는 위치
    - 사용자가 직접 관리하는 메모리 영역

참조 : https://yaboong.github.io/java/2018/05/26/java-memory-management/

JAVA

Java 시작

  • class명은 대문자로 시작
public class Main {
  • class : 원본 폴더, 설계도
  • 객체 : 복제 폴더, 제품
Car car1 = new Car();
  • 자바는 클래스(설계도)가 필수! but 자바스크립트는 설계도 없이 객체 생성 가능
  • 기본 자료형 변수에 객체를 넣을 수 없다.
    - 하지만, 어떻게는 객체를 넣어보려 시도는 해본다.
int a = new Car(); // (x)
  • 예시 코드
public class Main {
    public static void main(String[] args) {
        Car car1 = new Car();
        Car car2 = new Car();

        car1.max_speed = 100;
        car2.max_speed = 200;

        System.out.println(car1.max_speed);
        System.out.println(car2.max_speed);
    }
}

class Car {
    int max_speed;
}
  • class는 Code영역(Read Only)에 저장된다. (= 원본)
  • Heap(Read, Write)에 객체로 가져올 경우 클래스에 있는 변수를 수정할 수 있다.
    → class의 복제 폴더 생성
  • class 내에서만 변수를 선언할 수 있고, 각 객체마다 해당 변수의 값을 지정할 수 있다.
    ❗변수 값은 class의 변수를 직접 수정하는 것 X
      → class에서 생성된 text파일까지 함께 복사하여 각 text파일의 내용 수정 가능
  • class내의 method는 실행파일과 같다.
    → method의 내용을 수정할 수 없고, “실행” or “실행하지 않음” 만 선택할 수 있다.

this

  • 객체를 조종하는 리모콘 역할
  • 객체를 heap에 복제했을 때 리모콘도 함께 복제된다.
Car car1 = new Car(); 
// new Car()로 객체 리모콘 생성
// Car car1 = new Car(); 로 객체 리모콘을 car1에 복제
// 총 2개의 리모콘 생성
  • 예시 코드
public class Main {
    public static void main(String[] args) {
        Car car1 = new Car(100);
        Car car2 = new Car(200);

        car1.max_speed = 100;
        car2.max_speed = 200;
    }
}

class Car {
    public Car(int max_speed) {
        this.max_speed = max_speed;
    }

    int max_speed;
}

자바의 2가지 변수 타입

  • 일반 : byte, short, char, boolean, float 등…
  • 레퍼런스 : 그 외 나머지 변수 타입
int a =  // 일반 변수 타입
Car car1 // 레퍼런스 변수 타입