운영체제 서론(Operating System)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
경성대학교 양희재 교수님 수업 영상을 듣고 정리하였습니다.


Operating System 운영체제

컴퓨터를 제어하고 관리해주는 프로그램.
os: windowXP, linux, macOSX…

만약 이러한 os가 없는 컴퓨터는 어떤 상태일까?

  • 일반적으로 컴퓨터는 processor(처리기)memory(메인 메모리)로 구성이 되어있다.
  • 어떤 프로그램을 실행하기 전에 메모리에 명령들을 기록해놓는다.
    • (이때 명령들을 instuction이라고하고, 이 instuction의 집합을 프로그램이라고 한다.)
  • 이 프로그램들을 미리 메모리에 내장해두고 실행하기에 이런 구조의 컴퓨터를 프로그램 내장형 컴퓨터 라고 한다.(Stored program concept)

그런데 이러한 메모리에 아무런 운영체제가 깔려있지 않는다면?

  • 컴퓨터의 메모리에는 자기 멋대로의 임의의 값들이 들어있다.
  • 그래서 명령을 들고와서 실행을 하려해도 멋대로 명령이 들어오기에 할수 있는 일이 없다.

컴퓨터라고 하는 것은 전원을 키면 어떤 일이 일어나는가?

  • 휘발성 메모리: 전기를 끄면 그 내용이 다 사라짐 (램과 같음)
  • 운영체제가 없는 상태에서 전원을 껐다 키면 자기멋대로의 값이 있기 때문에 실행이 들어와도 자기 멋대로의 명령이 실행됨
  • 운영체제 없는 컴퓨터는 야생마 같다.

즉, 우리가 사용을 못한다.

운영체제가 하는일?!

  • 프로그램을 실행하기 위해 하드디스크 안에 들어있는 실행파일들을 메모리에 올려준다.
  • 하나의 프로세서(cpu)만으로도 여러개의 프로그램을 실행할 수 있도록 한다.(메모리에 동시에 올라가 실행할 수 있도록)
  • 컴퓨터의 파일을 프린트에 인쇄할 수 있도록 해준다.
  • 문서를 편집하고 하드디스크에 저장하는 것또한 가능하게 해준다. 등등등

운영체제가 있기 때문에 이 컴퓨터를 온전히 쓸수 있는것이고, 그게 없으면 그 컴퓨터는 그냥 폭주하는 컴퓨터, 제어가 불가능한 컴퓨터가 되는것.

즉, 컴퓨터의 하드웨어(프로세서, 프린트, 메모리, 하드디스크, 키보드, 마우스, 모니터, 네트워크, 스피커, 마이크 등)를 잘 관리해서

  1. Performance: 성능 향상(좋은 os를 설치하면 내 컴퓨터의 성능도 좋아진다.)
  2. Convenience: 사용자 편의 제공 (os가 있기에 우리가 원하는대로 사용이 가능한 것)

즉, 운영체제는 컴퓨터를 제어하고 관리해주는 프로그램 (Control progran for computer) 이다.

부팅(Booting)

막간, 컴퓨터 구조 지식)

  1. 컴퓨터 구조에 따르면 컴퓨터라는 것은 프로세서와 메인 메모리로 구성되어있다.
  2. 그 외에도 보통의 컴퓨터에는 하드디스크라는 보조기억장치를 가지고 있다.
  3. 메인메모리는 램과 롬으로 구성되어 있다.
  • 램(RAM): 메모리의 대부분을 차지하고 있는것 (우리 컴퓨터 메모리가 4GB라고 한다면 그것은 램을 의미하는 것) MB, GB -> 10의 9승
  • 롬(ROM): 극히 일부분이고 사이즈가 별로 없어도 되는데 KB 정도임 -> 10의 3승

우리가 전원을 껏다키면 램의 내용은 휘발성메모리이기에 다 날아가 버린다. 그렇기 때문에 전원을 껏다키면 메모리 안의 내용은 유지되지 않고 다 날아가버린다. 그런데 이 전원에 관계없이 계속해서 남아있는게 있는데 그게 하드디스크이다. 이 하드디스크와 메인메모리의 롬은 전원과 관계 없이 내용이 그대로 남아있다.

우리가 잘 아는 롬은 휴대폰 안에 들어있는 플래쉬메모리 또한 전원과 관계없이 내용이 남아있다.

컴퓨터의 전원을 키는 순간 컴퓨터에서 일어나는 현상들

  • 파워을 처음에 딱 껏다가 키면 프로세서는 롬 부분의 코드를 읽어온다. 즉, 롬 안의 instuction을 읽어와서 실행한다.
  • 이 프로그램에 제일 먼저 있는 내용은 POST(Power on self-test) 프로그램이다.
    • 전기를 키면은 컴퓨터가 모든 환경설정이 제대로 되어있는가를 확인
    • 키보드 연결되어잇는가, 메인 메모리는 얼마나? 프린트는? 이런것들을 테스트 > 셀프테스트
  • POST가 먼저 실행되고 내 컴퓨터 안에는 메모리가 얼마고, 하드디스크 용량은 얼마고를 확인하고
  • 그 다음으로는 boot load라는 것이 실행된다.
  • 이 부트로드를 통해서 하드디스크 안에 들어있던 os를 메인메모리로 가져오게 된다.

Boot Load

위에서 먼저 언급했던 것처럼 처음 전기를 키면 롬에 있는 코드가 실행되어 POST가 실행되고 boot load가 실행된다.

일반적으로 운영체제는 하드디스크 안에 설치가 된다.

하드디스크 안의 운영체제가 있고 boot load는 하드디스크를 뒤져서 운영체제를 메인메모리로 가져오는 역할을 한다.

부트로드라고 하는 작은프로그램이 하는 일은 하드디스크의 몇번째 어디에 운영체제가 있다는것을 알아서 메인메모리의 램 영역으로 가져오는 역할을 한다. 그래서 하드디스크에 있던 운영체제가 메인메모리로 올라오게 된다. 이렇게 하드디스크에 있던 운영체제가 메인메모리로 올라오는것을 부팅(booting)이라고 한다. 메인메모리로 운영체제를 들고오게되면 이제 더이상 롬의 프로그램은 실행될 것이 없다. 이렇게 롬의 역할은 끝나게 되는것이고 롬은 파워를 키는 그 순간에만 필요하고 그 이후에는 필요하지가 않다.

일단 운영체제가 메인메모리로 올라오게 되면, 우리가 친숙한 모니터에 익숙한 바탕화면이 나타나게 된다. 그러면 컴퓨터 모니터에는 바탕화면의 아이콘들이 모여잇는 초기화면이 나타나고 이떄, 바탕화면이 나타난다는 것은 운영체제가 메모리에 상주(residence)해서 이제 무슨 명령이든 받을 준비가 다 되어있으며 일을 시켜도 된다는 것을 의미한다. = 준비되어 제어가 된 상태 (사용자가 마음대로 제어할 수 있는 단계가 된 것.)

즉, 모든 제어를 운영체제가 해주기때문에 누구든 쉽게 사용이 가능하게 된다.

그리고 운영체제는 컴퓨터의 성능도 높여주는데, 이 운영체제가 사라지는 순간은 컴퓨터의 전기를 끄는순간 메모리에서 사라진다. 다른 일반 사용자 프로그램들은 메모리에 올라왔다가 사라지기를 반복한다. 만약 운영체제가 돌아가고 있는 상황에서 우리가 hwp를 사용한다고 하면 그게 메인메모리에 올라오게되고 해당 프로그램을 편집하고 종료하면 hwp 프로그램은 메모리에서 사라진다. 이렇게 다양한 프로그램들은 메모리에 올라왔다가 사라지고 그렇게 돌아가기를 반복한다.

그러나 os는 항상 그 자리에 잇음 = 메모리의 레지던트(상주한다)

즉, 운영체제는 컴퓨터가 꺼질때까지 메인 메모리에 상주한다.

따라서 운영체제라는 것은 결국…

  • 컴퓨터를 관리하는 프로그램 (사용자가 원하는 대로 제어 가능하도록 만들어주는 것)
  • 무엇을 관리? 여러 하드웨어 장치들을 관리

그런 운영체제는 크게 두가지로 나뉜다 - Kernel과 Shell(Command Interpreter)

컴퓨터 제일 내부에는 하드웨어가 있고 하드웨어를 제어하고 관리해주는 os가 하드웨어를 둘러싸고 있다.

  • 커널(Kernel): 핵심&핵, 하드웨어를 제어하고 관리하는 os의 부분, os에서 가장 중요한 부분
    • 메모리, 디스트, cpu등을 실질적으로 관리하는 프로그램
  • 명령해석기(command interpreter, shell): os의 껍질
    • 사용자가 어떤 명령을 내리면 그 명령을 해석해 결과를 화면에 보여주는 역할

컴퓨터에 윈도우를 깔면 여러개의 아이콘들이 모여있는데 이 아이콘들을 실행하려면 마우스를 들고가서 더블클릭을 해야한다. 이렇게 우리가 마우스를 들고가서 프로그램을 실행하려고 하는 행위, 내가 어떤 프로그램을 실행하기 위한 명령을 내릴 수 있도록 만들어 준것을 os의 command interpreter라고 한다. 일반적으로 윈도우는 그래픽 환경에서 명령을 내리고 리눅스는 텍스트를 기반으로 명령을 내리린다. 그래서 우리가 쉘에 명령을 내리면 그 쉘이 하드디스크를 뒤져서 해당 명령에 대한 결과를 보여준다.

리눅스 명령어 약간의 팁!

- ls(list): 현재 디렉토리에 존재하는 파일의 이름을 알고 싶을때
- who: 리눅스는 서버운영체제이기 때문에 한번에 여러명이 사용한다 ,누가 이 컴퓨터를 사용하는지 알아볼때
- df(disk free): 이컴퓨터의 하드디스크 용량은 얼마고 얼마를 사용햇는지 확인

즉, shell과 interpreter는 os의 바깥부분에 위치해서 사용자로부터 명령을 받고, 그 명령을 인터프리터를 통해 해석/번역하여 해당 명령을 실행하는 것을 의미한다.

그래서 커널은 실질적으로 우리 눈에는 보이지 않고 (관리하는 애니까) 우리는 주로 껍질을 보게 된다. 즉, 우리가 일반적으로 윈도우를 잘 안다고 하는것은 그 윈도우를 사용하는 법을 잘 안다는 것이고 그 사용법을 잘 안다는 의미는 이 껍질을 잘 안다는 뜻이다.

우리가 공부하는 운영체제는 껍질이 아닌 커널!

운영체제의 위치

컴퓨터는 하드웨어 > 운영체제(커널+쉘) > 애플리케이션 이렇게 구성되어있다.

이때 애플리케이션은 응용 프로그램으로(App, application)을 의미하고 이 앱들은 os위에서 실행되며 따라서 만약 os가 달라지면 이 프로그램(앱)들은 사용이 불가능하다. 하드웨어가 같음에도 불구하고 사용이 불가능한 이유는 os가 다르기 때문이다. 애플리케이션은 하드웨어 위에서 도는게 아니라 os 위에서 돌고있기에 한 프로그램을 돌게 하기 위해서는 반드시 os가 반드시 필요하다.

즉, 컴퓨터의 제일 밑에는 하드웨어가 있고, 이런 하드웨어들이 컴퓨터의 하드웨어를 이루고 있고 이 하드웨어들을 제어/통제해주는 프로그램이 운영체제이다. 운영체제 위에는 어플리케이션 프로그램이 있고 프로그램들은 하드웨어 자원을 사용하고 있지만, 하드웨어 자원을 직접적으로 사용하는게 아니라 os가 중간에 관리해주는대로 하드웨어 자원을 사용하고 있다.

  • 하드웨어 예: cpu, 메모리, 프린터, 모니터, 키보드, 마우스, 램카드, 스피커, 마이크 등등
  • 어플리케이션(프로그램) 예: ms word, hwp, 게임, 데이터베이스, 인터넷 익스플로어, mp3, 비디오 플레이어 등등

운영체제 vs 정부

운영체제는 정부와 비슷하다. 즉, os도 여러가지 부서가 있다.

  • process management: cpu 즉 프로세를 관리
  • memory management: 메인 메모리를 관리
  • io management: 입출력
  • file management: 하드 디스크의 파일들 관리
  • network management: 네트워크 관리
  • security/protection management: 컴퓨터의 보안을 관리

하드웨어를 자원이라고 하고 이 자원들을 관리하는 것이 os!
os의 다른 이름은 resource manage라고 한다.
하드웨어 자원을 애플리케이션에 할당해주는 것을 os가 하는 일이다.

git merge conflict - fast-forward와 3-way-merge

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


문제상황

지금까지 git을 통한 협업 시 merge conflict(병합충돌)은 같은 파일의 같은 라인을 수정하면 무조건 일어나는 것이라고 생각했다. 그런데 병합 충돌이 일어나지 않는 경우를 발견했다.

merge를 하는 방식에는 fast-forward3-way-merge 두 가지가 있다.

fast-forward

우선 fast-forward방식은 우선 아래의 그림에서부터 출발해본다.

여기서 C는 커밋(Commit)을 의미한다. 작업을 진행하며 위와같은 커밋이 진행되었고 현재 C2에 master가 존재하고 있다.

이때 이슈가 생겨 iss53이라는 브랜치를 생성하면 위와 같은 그림처럼 형성이 된다. 당연하게 iss53 브랜치에서 하는 행위 그 어떠한 것도 master에는 영향을 주지 않는다.

iss53 브랜치에서 이슈를 다 해결하고 커밋을 날리면 위와 같이 커밋 히스토리가 있을 것이다. 즉, master는 C2에 있지만 iss53은 C3를 가리키고 있다.

중요한 포인트가 뭐냐하면, C3의 커밋에는 C2까지의 내용이 모두 담겨있다는 사실이다. 이 상태에서 master로 merge를 하는 것은 단순히 master의 포인터를 최신 커밋을 가리키고 있는 C3로 옮기는 것을 의미한다.

현 브랜치가 iss53 브랜치 일 것이기에,

git ckeckout master
Switched to branch "iss53"

git merge iss53

Updating f42c576..3a0874c
Fast-forward
 index.html | 2 ++
 1 file changed, 2 insertions(+)

이렇게 merge 메시지에서 fast-forward가 보일 것이다.

C3 커밋이 C2커밋에 기반한 브랜치이기 때문에 브랜치 포인터는 merge 과정없이 그저 최신 커밋으로 이동을 한다. 이런 방식이 fast-forward 방식이다.

  • A와 B 브랜치가 있다.
  • A->B를 머지하려고 한다.
  • B가 A 이후의 커밋을 가리키고 있다. (B의 조상커밋이 A이다.)
  • A는 단순히 B와 동일한 커밋을 가리키도록 이동한다.

즉, 단순히 포인터를 최신 커밋으로 옮기는 것을 fast-forward 방식이라고 한다.

3-way-merge

이제 git에서 협업시 가장 많이 이루어지는 3-way-merge를 살펴보겠다.

다시 master 브랜치에서 이슈가 발생해 iss53 브랜치를 생성해 이슈를 해결하고 커밋을 날린 상황으로 돌아가 보겠다.

그런데 이때 master 브랜치에서 급하게 해결해야 될 핫 이슈가 발생했다.

그래서 master에서 hotfix 브랜치를 생성해서 급히 생긴 이슈를 해결하고 commit을 날린 후 master에서 merge를 했다.

즉, 이 상황은 아래와 같다.(iss53 시점에서부터 시작하겠다.)

git ckeckout master # iss53브랜치에서 master로 이동

git branch hotfix # hotfix브랜치 생성
git checkout hotfix # hotfix 브랜치로 이동

# 이슈 해결 뒤

git add -A
git commit -m 'hotfix 해결'

git ckeckout master # master 브랜치로 이동

git merge hotfix

그러면 이제 위 그림과 같이 master는 C4에 있게 되고 현재 포인터가 C4를 가리키게 된다.

이제 hotfix를 해결했으니 해당 브랜치는 삭제한다.

git branch -d hotfix

이제 다시 우리가 개발하던 iss53으로 돌아가 작업을 완료하고 커밋을 날려 C5라는 커밋 히스토리를 남겨보자.

이때 fast-forward와 다른 점이 보일 것이다.

현재 가리키는 커밋(C4-master)가 merge할 브랜치(C5-iss53)의 조상(C3)가 아니기 때문에 fast-forward 로 머지를 하지 않는다.

git checkout master

git merge iss53

Merge made by the 'recursive' strategy.
index.html |    1 +
1 file changed, 1 insertion(+)

즉, 3-way-merge는 각 브랜치가 가리키는 커밋 2개(C4, C5)와 공통의 조상 1개(C2)를 사용하는 것을 의미한다.

3-way-merge의 최종결과는 위와 같다.

3-way-merge의 결과를 별도의 커밋으로 만들고 해당 브랜치가 그 커밋을 가리키도록 이동시킨다. 그 커밋은 C6이고 해당 커밋의 부모는 여러개가 되어있는 것을 볼 수 있다.

이때, 3-way-merge에서 merge-conflict가 발생할 수 있는 것이다. merge하는 두 브랜치에서 같은 파일의 같은 부분을 동시에 수정하게 되면 git은 해당 부분을 merge를 하지 못한다.

일반적으로 git은 자동적으로 merge를 하지 못하기 때문에 새로운 커밋또한 생성되지 않는다. 변경사항의 충돌은 개발자가 해결해주지 않는 한 merge 과정을 진행할 수도 없다.

그동안 병합충돌은 어느 방식에서든 같은 파일의 같은 곳을 수정하면 무조건적으로 일어나는 것이라고 생각했었다. 근데 해당 충돌이 일어나는 방식은 3-way-merge에서만 발생하는 것이란걸 알게되었다..

사실 지금도 매우 놀랍고 이해가 안가는 부분도 있지만.. 일단 그렇다고 한다. 만약 제가 이해한 부분이 틀렸다면 언제든지 댓글을 남겨주세요.

python reverse, reversed 함수의 차이

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


reverse()

  • list의 자료형 함수 = list 타입에서 제공하는 함수
  • list 요소를 역순으로 정렬해준다.
l = [1,2,3]  #[3,2,1]
t = (1,2,3)  # AttributeError: 'tuple' object has no attribute 'reverse'
d = {'a':1, 'b':2, 'c':3}  # AttributeError: 'dict' object has no attribute 'reverse'
s = '123'  # AttributeError: 'str' object has no attribute 'reverse'
li = [1,2,3]
li_reverse = li.reverse()
print(li_reverse)  # None, 값을 반환해주지 않고 단순히 해당 list를 뒤섞어준다.
print(li)  # [3,2,1]

reversed()

  • 파이썬의 내장함수 = list에서 제공해주는 함수가 아니다.
  • iterator의 요소를 역순으로 리턴
  • 원본을 변경하지는 않는다.
l = [1,2,3]  # <listreverseiterator object at 0x101053c10>
t = (1,2,3)  # <reversed object at 0x101053b50>
d = {'a':1, 'b':2, 'c':3}  # TypeError: argument to reversed() must be a sequence
s = '123'  # <reversed object at 0x101053c10>

이렇게 딕셔너리는 시퀀스 타입이 아니기에 지원해주지 않으며, 인덱스로 순차적인 접근이 가능하지 않은 애들한테는 reversed()는 지원되지 않는다. 그리고 reversed함수는 reversed객체를 반환한다. 근데 list에만 listreverseiterator를 반환하고 있다. (아직 이 유의미한 차이에 대해서는 잘 모르겠다…)

여튼, reversed객체는 list나 tuple로 사용하고 싶다면 아래와 같이 한다.

li = [ i for i in range(5) ]
print(list(reversed(li)))  # [4,3,2,1,0]
print(li)  # [0,1,2,3,4]

staticmethod와 classmethod 한번 더 정리해보기

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


클래스의 인스턴스를 통하지 않고 클래스에서 바로 메서드를 호출하는 방법에는 정적 매서드와 클래스 메서드가 있다.

Staticmethod

우선 정적 메서드는 메서드 위에 @staticmethod을 붙이며 매개변수로 self를 지정하지 않는다.

class 클래스이름:
  @staticmethod
  def 메서드(매개변수1, 매개변수2)
    코드
class Calc:

  @staticmethod
  def add(a,b):
    print(a+b)

  @staticmethod
  def multi(a,b):
    print(a*b)

Calc.add(10,20) # 30
Calc.multi(3,5) # 15

Calc 클래스에서 @staticmethod 를 붙여서 add와 multi 메서드를 만들었고, 정적 메서드를 호출할 때는 클래스에서 바로 메서드를 호출하면 된다. 정적 메서드는 self 를 매개변수로 받지 않으며 그렇기 때문에 인스턴스 속성에도 접근이 불가능하다. 그래서 보통 정적메서드는 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 사용한다.

즉, 여기서 만든 Calc 클래스에 들어가있는 add, multi 메서드는 숫자 두개를 더하거나 곱할 뿐 인스턴스의 속성은 필요하지 않음을 의미한다. 이러한 정적메서드는 메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수함수(pure function)을 만들때 사용한다. 따라서 저적 메서드는 인스턴스의 상태를 변화시키지 않는 메서드를 만들때 사용한다.

Classmethod

클래스메서드 또한 메서드 위에 @classmethod 를 붙이고 첫번째 매개변수로 cls를 지정한다.

class 클래스이름:  
  @classmethod
  def 매서드(cls, 매개변수1, 매개변수2)
    코드
class Person:
  count = 0

  def __init__(self):
    Person.count += 1 # 인스턴스가 만들어질때 클래스 속성 count에 1을 더함


  @classmethod
  def print_count(cls):
    print(f'{cls.count}명 생성 되었습니다.') # cls로 클래스 속성에 접근


jane = Person()
mike = Person()

Person.print_count() # 2명 생성되었습니다.

코드를 풀이해보면

  • 인스턴스가 만들어질때마다 숫제를 세어주는 count += 1 을 만든다.
  • 이때 클래스 속성에 접근하는 것을 명확히 하기 위해 Person.count로 만들어준다.
  • 그리고 @classmethod를 통해 클래스 메서드를 생성한다.
  • 이때 클래스 메서드는 첫번째 매개변수를 cls로 받음으로써 현재 클래스를 받는다.
  • 따라서 cls를 통해 count 속성에 접근할 수 있게 된다.

  • 우리는 아래서 jane, mike 두개의 Person 인스턴스를 만들었고
  • print_count 호출하게 되면 생성된 두개의 인스턴스를 출력해주는 것을 볼 수 있다.
  • print_count는 클래스 메서드이기때문에 Person.print_count()로 호출된다.

클래스 메서드는 정적 메서드처럼 인스턴스 없이 호출된다는 점은 같다. 그러나

  • 클래스 메서드는 메서드 안에서 클래스 속성, 클래스 메서드에 접근해야할 때 사용한다.

특히 cls를 사용하면 메서드 안에서 현재 클래스의 인스턴스를 만들 수도 있다. cls는 클래스이기때문에 cls()는 Person()과 같다

클래스와 객체, 그리고 인스턴스는 무엇일까?

|

개인적인 연습 내용을 정리한 글입니다.
잘못된 내용이 있다면 편하게 댓글 남겨주세요!


프로그래밍을 공부하다보면, 프로그래밍 용어가 참 어려울때가 많다. 어떤 때는 인스턴스 어떤 때는 객체, 처음 공부를 시작할떄 제대로 머리에 정리를 안하고 지나가니 계속해서 발목을 잡는것 같아 이제서라도 하나하나 정리해보려고 한다.

그리고 덧붙여 나는 이 개념들이 자바를 공부하면서 좀 더 확실하게 알게 된 것 같다.

클래스?

  • 개념
    • 객체를 만들어내기 위한 설계도 혹은 틀 (ex. 붕어빵 틀)
    • 연관되어있는 변수(속성)과 메서드의 집합

객체?

  • 개념
    • 클래스에 선언된 모양 그대로 생성된 실체
  • 특징
    • ‘클래스의 인스턴스’
    • 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.
    • oop 관점에서 클래스의 타입으로 선언되면 그것을 객체로 부른다.

인스턴스?

  • 개념
    • 설계도를 바탕으로 구현된 구체적인 실체
    • 즉, 객체를 소프트웨어에 실체화하면 그것을 인스턴스라고 부른다
    • 실체화된 인스턴스는 메모리에 할당된다.
  • 특징
    • 인스턴스는 객체에 포함됨
    • oop 관점에서 객체가 메모리에 할당되어 실제 사용될때 인스턴스라고 부른다
## 막간 지식으로 oop란 무엇인가?

OOP: Object Oriented Programming(객체지향프로그래밍)
객체지향 프로그래밍(이하 OOP)는 컴퓨터 프로그램을 객체들의 모임으로 파악하고자하는 프로그래밍의 패러다임 중 하나이다. OOP의 장점은 프로그램을 유연하고 변경이 용이하게 만들며 개발과 보수를 간편하게 만든다.

- 강한 응집력
- 약한 결합력

프로그램의 한 요소가 특정 목적을 위해 밀접하게 연관된 기능들로 모여 구현되어있고 그 요소요소가 다른 요소들과 관계를 크게 맺고있지 않은 것을 볼 수 있다. OOP의 경우 클래스 하나에 문제 해결을 위한 데이터를 모아놓은 객체를 활용함으로써 응집력을 강화하면서도 클래스 간 독립적인 디자인을 함으로써 결합력을 약하게 하고 있다.

클래스와 객체

클래스는 설계도, 객체는 설계도로 구현한 모든 대상을 의미

객체와 인스턴스

  • 클래스 타입으로 선언되었을 때 객체라고 부르며, 그 객체가 메모리에 할당되어 실제 사용될때 인스턴스라고 함
  • 객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다.
  • 객체는 ‘실제’, 인스턴스는 ‘관계’에 초점을 맞춤

참고>