컴퓨터시스템은 하드웨어, 운영체제, 응용프로그램, 사용자로 구분할 수 있다.


그림출처: https://en.wikipedia.org/wiki/Operating_system


하드웨어: CPU(중앙처리장치), 메모리, 입출력(I/O) 장치로 구성되어 기본 계산용 자원을 제공한다.

응용 프로그램: 컴파일러, 어셈블러, 텍스트 에디터, 데이터베이스 시스템 등과 같은 자원이 어떻게 사용될지를 정의한다.


운영체제는 하드웨어 자원을 관리하여 응용 프로그램에 편리한 서비스를 제공하고, 

응용 프로그램과 컴퓨터 하드웨어 간의 인터페이스 역할을 하는 프로그램이다.



운영체제의 목적

1. 사용자에게 프로그램을 효율적이고 편리하게 실행할 수 있는 환경을 제공한다.
2. 컴퓨터 자원을 공정하고 효율적인 방식으로 할당한다.
3. 응용 프로그램의 실행을 감독하여 오류를 방지하고 입출력 장치를 관리한다.


운영체제와 커널(Kernel)
커널은 운영체제의 핵심부분으로서, 운영체제의 실질적인 모든 작업을 관리한다.

운영 체제는 커널 공간과 사용자 공간으로 구성되어, 
일부 유용한 응용 프로그램과 유틸리티가 커널에 추가된 완전한 패키지가 OS가 된다. 

예를 들면,
리눅스는 파일 시스템 유틸리티, 텍스트 편집기 등과 같은 응용 프로그램을 포함하지 않기 때문에 커널이라고 말할 수 있다. 
그렇기에 여러 회사가 리눅스 커널을 통해 이러한 종류의 응용 프로그램을 추가하였고 
리눅스 커널을 기반으로 한 우분투, centOS, redHat 등과 같은 운영 체제가 나오게 되었다.



참고 도서: Operating System Concepts 9th


0. Formal Parameter & Actual Parameter

Formal parameter: 메소드의 선언부에 나타는 인자

ex) public void funA(String a);


Acutal parameter: 실제 값을 가진 인자

ex) funA("abc");



1. Call-by-Value (값에 의한 호출)

약속된 메모리 공간에 actual parameter의 값을 보내며, formal parameter를 초기화한다.

원본에 영향을 주지 않고 원본의 값만 이용하여 새로운 메모리 공간에서 사용하고 싶은 경우에 call-by-value 방식이 좋다. 



2. Call-by-Reference (참조에 의한 호출)

약속된 메모리 공간에 actual parameter의 주소 값을 보내, 원본의 값이 변경된다.

함수는 return 문을 이용해 하나의 결과값을 반환한다. 

두 개 이상의 결과를 반환해야 할 때는 call-by-reference 방식을 사용해 직접 원본의 값을 변경함으로서 해결할 수 있다.



3. 예시

1
2
3
4
5
6
7
8
9
10
11
12
Program X:
    integer m;
    procedure Y (n : integer)
        begin
            n = n+1;
            write(m, n);
        end;
    begin {start main}
        m = 1;
        Y(m);
        write(m);
    end;
cs

call-by-value 일 때의 결과: m: 1 n:2 m:1

call-by-reference 일 때의 결과: m: 1 n:2 m:2



4. C언어의 호출방식

C언어를 call-by-value 방식으로 한다면, "fun(int a)" 코드처럼 a의 값을 보낸다.

call-by-reference 방식으로 한다면, "fun(int* a)" 와 같은 포인터를 사용해 a의 주소값을 전달한다.

(주소값 또한 call-by-value 방식처럼 값을 복사하여 전달한다고 하여 call-by-reference 가 아닌 call-by-value 방식이라 한다고도 한다.)



5. JAVA의 호출방식

기본 데이터형은 call-by-value 방식으로 처리되고, 클래스의 객체는 call-by Reference 방식으로 처리된다.

(객체의 주소값 역시 call-by-value 방식처럼 값을 복사하여 전달되기 때문에 call-by-reference 가 아닌 call-by-value 방식이라 한다고도 한다)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class CallByValue {
 
        public static void swap(int x, int y) {
               int temp = x;
               x = y;
               y = temp;
        }
 
        public static void main(String[] args) {
               int a = 10;
               int b = 20;
               System.out.println("swap() 호출 전: a="+a+", b="+b);
               swap(a,b);
               System.out.println("swap() 호출 후: a="+a+", b="+b);
        }
}
 
// 결과
// swap() 호출 전: a=10, b=20
// swap() 호출 후: a=10, b=20
 
//[출처] ▣ JAVA - Call by Value, Call by Reference|작성자 kaka
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Number {
        public int a;
        public int b;
}
 
public class CallByReference {
 
        public static void swap(Number z) {
               int temp = z.a;
               z.a = z.b;
               z.b = temp;
        }
 
        public static void main(String[] args) {
               Number n = new Number();
               n.a = 10;
               n.b = 20;
               System.out.println("swap() 호출 전: a="+n.a+", b="+n.b);
               swap(n);
               System.out.println("swap() 호출 후: a="+n.a+", b="+n.b);
        }
}
 
// 결과
// swap() 호출 전: a=10, b=20
// swap() 호출 후: a=20, b=10
 
//[출처] ▣ JAVA - Call by Value, Call by Reference|작성자 kaka
cs

number 클래스의 객체를 생성하고 저장된 값은 주소값이다.

main() 에서 Number 클래스의 객체인 n을 만들어 인수로 전달하기 때문에 swap() 내에서 Number 클래스 내의 x, y의 값을 바꾼 결과가 main() 에 영향을 미치게 된다.




참고 출처: http://blog.naver.com/PostView.nhn?blogId=clown7942&logNo=110121061770



이 블로그에 잘 정리되어 있다.

https://blog.perfectacle.com/2017/02/09/c-ref-004/

+ Recent posts