본문 바로가기

컴퓨터 일반/프로그래밍언어론

프로그래밍언어 문제(2)

C언어에서 배열이 A(3,4)로 선언되었다.
배열의 시작주소가 200일 때
A(1,3)의 주소는 얼마인가?

 

A(3,4)는 3행 4열이므로

200 (0,0) (0,1) (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (2,3)

A(1,3)의 주소는 207이다.

 

공식을 사용하여 주소를 구할수도 있다.

위치가 (i,j)이고 크기가 (K,L)일때 

행 우선이라면 L * i + j = 7

207이 된다

 

https://www.youtube.com/watch?v=FPrqX5Eg8G4&t=1190s

main 함수를 찾는다

정수형 변수 a,b와 배열 c가 선언되어 있다

a에는 20, b에는 20, c[0]에는 20을 준다

a b c  
20 20 20  

 

func(&a, b, c);를 호출한다

&a는 주소값, b는 값, c는 주소값이 들어간다

 

위에서 만들어진 func() 함수를 보면

x = *a; //a가 가진 값을 x에 넘긴다 (20)
*a = x++; //a가 가리키는 값을 넘겨주고 x는 1을 증가시킨다 (21)
x=b; //b를 x에 넣는다, x는 20이 된다
b = ++x; //x를 1 증가시키고 b에 넣는다, b는 21이 된다
--(*c); //c가 가리키고 있는 값을 하나 감소시킨다, c는 19가 된다

함수를 호출한 곳으로 돌아간다.

a와 c는 공동값(주소)를 사용하기 때문에 값이 바뀌어있다.

a는 20, c는 19이다.

하지만 b는 20으로 값이 바뀌지 않는다.

출력하면 20 20 19

 

https://www.youtube.com/watch?v=FPrqX5Eg8G4&t=1190s

 

맨 위에서 선언되는 int a,b,c는 전역변수이다. 

a b c
10 20 30

main 함수를 찾는다. main은 func() 함수를 호출하고 있다.

func() 함수를 보면 변수 두개를 호출하는데 한개는 정적변수이다

a (정적변수) b
100 200
101 201

c = a; //a값을 c에 넣는데 c는 블럭 안에 없으므로 밖에 있는 전역변수 c를 101로 바꾼다.

 

func() 함수를 한번 더 호출한다.

a (정적변수) b
101 200
102 201

정적변수는 값이 초기화되지 않기 때문에 102가 되고

b는 초기화 되었기 때문에 201이 된다.

a 값을 c에 넣으면 블럭 밖에 있는 c의 값이 102로 바뀐다.

마지막으로 출력하면 a는 10, b는 20, c는 102가 출력된다.

전역 변수는 해당 파일을 넘어 다른 파일에서도 접근 가능하고
정적 변수는 선언된 파일 내에서만 접근이 가능하다 (위치 주의하기)

 

https://www.youtube.com/watch?v=BHB4sSf6Cik

main 함수를 찾는다

새로운 객체인 obj를 생성하고 변수를 정리한다

a b[ ]  
10 3 4

obj.swap(a,b) 함수를 호출한다. swap 함수는 a와 b를 인수로 가지고 간다.

블럭 내에서

i = 20;

j[0] = 30;으로 값이 바뀌게 된다

a b[ ]  
20 30 4

 

함수를 호출한 곳으로 돌아간다.

a는 지역변수이기 때문에 값이 다시 10이 되지만

b는 주소값이기 때문에 값이 변화되어 b[0]=30이다

a = 20, b[0] = 30, b[1] = 4를 출력한다.

주소가 바뀌면 같은 방을 쓰기 때문에

a는 값에 변동이 없지만 주소인 b는 값이 변한다. (그냥 변수값과 주소값의 차이 기억하기)

 

https://www.youtube.com/watch?v=BHB4sSf6Cik

switch(a)  //a값에 따라서 출력이 된다.

a는 0이므로 case 0을 실행한다

printf("%d\n", b++); break; //b인 1을 출력하고 break 한다.

화면에는 1이 출력된다.

 

https://www.youtube.com/watch?v=BHB4sSf6Cik

문자열은 배열이다.

substring (1,4) 함수는 s1[1] 부터 s1[4] 전까지 가져오는 것으로

k o r e a 1 9
0 1 2 3 4 5 6

1부터 3까지인 ore를 s2에 넣는다 -> 출력한다.

 

https://www.youtube.com/watch?v=BHB4sSf6Cik

  1. main 함수를 찾는다.
  2. 새로운 객체 f를 생성하고 Bar의 addValue(1) 함수와 addFive() 함수를 호출한다.
  3. 클래스 Bar는 부모 클래스인 Foo를 상속받아서 만들어진 클래스이다 "Extends 키워드"
  4. 부모 클래스에게 addValue()와 addFive() 함수를 물려 받아 오버라이딩을 했다.
  5. main 함수에서 호출한 f.addValue(1)의 인수는 정수이므로 정수형 인수를 받는 Foo 클래스의 addValue(int i)를 호출한다.
  6. a = 3이고, 3+1을 하므로 4이다. 즉 FO : 4가 출력된다.
  7. f.addFive() 함수는 오버라이딩 된 함수로 Bar 클래스의 addFive() 함수를 호출한다.
  8. int a = 8이고 a+= 5; 이므로 13이다
  9. 즉 Bar : 13을 출력한다.

https://www.youtube.com/watch?v=BHB4sSf6Cik

  1. 메인 함수에서 시작한다.
  2. 대문자 Super()는 프로그래머가 만든 함수이며, 소문자 super()는 this() 함수처럼 자바 시스템에서 지원 받는 함수이다.
  3. super() 는 상위 클래스를 의미한다.
  4. 메인 함수의 Super s1 = new Super('C'); Super s2 = new Sub('D');에 따라 객체를 두 개 생성한다.
  5. Super 클래스인 s1은 문자형 변수 'C'를 인자로 가져가므로 C를 출력한다
  6. Sub 클래스인 s2는 문자형 변수 'D'를 인자로 가져가므로 Sub(char x) 를 호출하는데 해당 블럭에서 this() 함수를 호출한다.
  7. this() 함수는 자기 자신의 생성자를 호출하게 한다. this()에 의해 매개변수 없이 Sub()을 호출한다.
  8. Sub() 함수블럭 안의 super() 함수는 상속 받은 바로 위의 클래스의 매개변수를 호출한다. 따라서 s2는 Super() 함수를 호출하여 'A'를 출력하게 된다.
  9. 즉 this()로 인해 sub()함수를 호출하고, 그 안의 super()함수로 상위클래스의 print('A')를 출력한 것이다
  10. 결과 : CA를 출력한다