!-- 멘토링 하는 친구에게 한 풀이 중...
- 고위직 자녀분 멘토링 가끔씩 한다. 몇 년 되었다...(중앙 정보 까지는 아니고 국가 기관의...)
-> interface는 자체적으로 객체를 생성(new)할 수 없습니다.
-> 1은 숫자이기때문에 변수명으로 사용이 불가능합니다.
1. 결과값 : Foo를 인스턴스 해서 Object로 캐스팅 후 저장했다가 Foo로 다시 캐스팅하여 Foo 형식에 저장. i는 변함없이 3
Q2
A. float[] f= new float[3];이 되어야 하는데 변수와 ( ) 때문에 error.
B. new float[] 때문에 error. 생성되는 배열의 개수 명시해야함.
F. float f4[] = new float[] { 1.0f. 2.0f. 3.0f}; 에서
{ 1.0f. 2.0f. 3.0f};부분은 오타입니다.
{ 1.0f, 2.0f, 3.0f};이 정상입니다. (.이 아니라 ,입니다)
3.i++ > --j 는 i > --j ; i++; 과 같은 효과
if(1>9) while(2<5)
if(2>8) while(3<5)
if(3>7) while(4<5)
if(4>6) while(5<5) → do while빠져나옴. 즉 i=5, j=6;
Q4
3line에서 생성된 Demo object가 garbage collection자격(대상)이 되는 시점. Demo를 d가 가르키고, takeDemo에서 d(이하 td)가 같이 가르키고 있다가 td는 null(연결 끊김)해서 다른 Demo가르킴. 3line에서 생성된 것은 계속 d가 가르키고 있어서 garbage collection일어나지 않음. 답은 E "이 코드를 수행하는 인스턴스가(전체가) 가비지 컬렉션 대상이 되었을 때"
d라는 변수는 클래스 변수인데, d변수에 대한 처리가 아무것도 없군요. 메소드에서도 d의 복사본만 넘길 뿐이죠. 메소드 안에서 demo를 null처리한다고 d가 null이 되거나 하는것은 아니죠.
결국 이 클래스 자체의 인스턴스가 gabage collection되기 전까진 d는 gc처리되지 않습니다.
자바에서는 call by reference가 없습니다. 오로지 call by value만 있을 뿐이죠. 확실히 call by reference는 없지만, 효과는 비슷하게 하기 위해서 object type은 object의 주소를 넘겨줍니다. 그래서 object의 property는 바꿀 수 있지만, 역시 주소는 바꿀 수 없습니다. 즉, 새로운 객체를 가리키게 할 수 없습니다.
takeDemo() method에서 파라미터 demo 는 새로운 지역변수입니다. 대신 주소값을 넘겨받았기 때문에 property는 바꿀 수 있지만,
9. demo = null;
10. demo = new Demo();
이 두줄처럼 한다고 새로운 object를 (주소를) 가리키는 건 아닙니다.
메소드가 끝나면 사라져 버리지요.(지역변수이기 때문에)
그러나 property는 바꾸면 그것은 유지가 됩니다.
왜냐면 변수가 여전히 같은 객체를 가리키기 때문이죠.
void test() {
String s = " AAA";
print(s);
}
void print(String s) {
s = "awfawef";
}
이런다고 test() method의 s가 값이 변하는 것은 아닙니다.
그러나,
void test() {
int[] s = new int[1];
s[0] = 1;
print(s);
}
void print(int[] s) {
s[0] = 2;
}
이렇게 하면 s[0]의 값이 2로 바뀝니다.
왜냐면 배열은 object이기 때문이고 property만 바꾸었기 때문이죠.
void print(int[] s){
s = new int[2];
}
만약에 위처럼 했다면 배열은 바뀌지 않았을 겁니다.
Q6.
A. 메모리는 Runtime.gc()의 호출로 인해 갱신된다.(gc는 요청을 할 수 있지만 즉각 갱신되지 않고 시스템이 알아서 한다.)
B. 만약 객체들이 살아있는 쓰레드들로부터 접근이 가능하다면, 그것들은 수집 되지않는다.(정답)
C. finalize()메소드를 가진 객체는 절대로 수집이 되지않는다.
D. finalize()메소드를 가진 객체는 프로그램 수행이 끝나기 전에 항상 finalize()메소드를 호출한다.
7.
A. 명시하지 않았을 때 default(friendly)
B. classB의 생성자는 매개변수 없음 (정답)
C. 생성자는 this()를 포함한다. -본인생성자는 포함할 필요없음
D. 생성자는 super()를 포함 - A상속받았기 때문에 부모의 생성자 호출(정답)
8. 3번과 비슷
if (1>10) , 9, while (2<5)
if (2>9), 8, while(3<5)
if (3>9), 7, while(4<5)
if (4>9), 6, while(5<5) → 끝 i=5, j=6
9.
A. Assertions(검증)은 class-by-class기반에서 가능 혹은 불가능하다.(?? 정답)
B. Conditional 컴파일은 클래스를 초 스피드로 테스트할때 사용한다. (???)
C. 검증은 메소드내의 인자들(argument)이 적절한가(validity)를 체크하는 appropriate.(조건에 맞는지 검증)
D. 프로그래머는 assertion(검증)실패 시 return 문장을 실행하거나 exception(예외)를 던지게 선택할 수 있다.(assertion 실패시 String 형태로만 출력)
10. 클래스가 같은 패키지에 있는 다른 클래스의 멤버로 접근하고자 할 때, 가장 제한적인 접근제한자는 무엇인가?
public (모두 접근) protected(같은 패키지, 다른패키지면서 상속받은클래스) default (같은 패키지 만 - O ) private (클래스 내에서만)
11. if를 비롯해 while과 같은 조건문에서는 true, false값만 들어갈 수 있다. x=y는 대입문으로 x에 1(int)값이 들어가기 때문에 실행불가.
12. 결과는 main에서 aMethod()를 호출하면 Excption()을 던지고서는 finally블록을 실행한다. 그리고 Exception을 캐취해서 exception출력을 하고, 마지막으로 finished를 정상출력한 후 끝낸다.
13. line 2(int k=4)와 같은것은 interface내의 멤버변수는 public static final이 생략되어있다. 정답은 A,B,C
Q14.
패키지 = 디렉토리또는 폴더의 개념
public : 모든 패키지로부터 접근가능
default(friendly) : 다른패키지에선 접근불가능
protected : 상속받은 다른패키지의 클래스에서도 접근이 가능
Test2.java:4: x is not public in test1.Test1; cannot be accessed from outside package
System.out.println("x = " + x);
원인 :: static int x이면 이것은 default 접근제한자(friendly라고도함)를 가집니다. 접근제한자부분을 써줄때 그부분에 아무것도 안쓰면 default접근제한자로 선언된것이고 접근의 범위는 같은 패키지안에서만 가능하죠. 그런데 package test2는 다른패키지이므로 접근할때 오류가뜹니다(test 2의 4line). 오류내용인즉 접근할 수 없다고 하는거죠
Q15. classA를 상속받은 클래스에서 올바른 (메소드)정의 2가지.
*오버로딩 : 메소드 명 똑같이, 매개변수 갯수가 다르거나 데이터 형이 다르거나.. 나머지는 상관없음.
*오버라이딩 : 메소드 명 똑같이, 반환형 같이, 매개변수 똑같이, 접근제한자 똑같거나 넓어짐.
A. 오버라이딩
B. 매개변수 같으면 오버라이딩인데 접근제한자 좁아짐(protected→private)
C. 오버로딩(매개변수 다르고 이름은 같음)
D. 오버라이딩인데 반환형이 다름.
E. 오버라이딩인데 static이 붙어서 문제가 생김
Q16.
for( 초기화 ; 조건 ; 후처리 )
{
구문;
}
초기화 -> 조건 -> 구문 -> 후처리 순으로 처리가 되는데
A -> B -> D -> C -> B -> D -> C -> B 이 순으로 처리가 됩니다. 차근차근 따라가 보세요. 'ㅅ'
foo('A') → foo('B')&&(0<2) →foo('D') → foo('C') → foo('B')&&(1<2) → foo('D') → foo('C') → foo('B')&&(2<2) → 끝 (A B D C B D C B)
for (A; B; C) {
D;
}
위의 형태를 예로 들겠습니다. 수행순서는 다음과 같습니다.
1. 첫번째 인자인 A는 무조건 수행한다.
2. 두번째 인자인 B를 수행한다.(조건확인)
3. B가 참이면 D를 수행하고 세번째 인자인 C를 수행한다. 만일 B가 거짓이면 for 문을 빠져나온다.
4. 두번째 인자인 B를 수행한다.(조건확인)
5. B가 참이면 D를 수행하고 세번째 인자인 C를 수행한다. 만일 B가 거짓이면 for 문을 빠져나온다.
17. asset 조건:String에서 String은 “Exception in thread "main" java.lang.AssertionError:[String] at Test.main(Test.java:3)
즉 C가 답이면 String 에서 true를 출력한다.
Q18. 배열을 생성(new float[10];)하면 자동으로 초기화 한다. float는 0.0으로 초기화.
Q19.
지역변수에서는 static 제한자를 사용할수가 없습니다.
사용할 수 있는 곳은 멤버 필드나, 메소드, 내부 클래스입니다.
Q20. 6번라인에 넣었을 때 에러나는 문장은...
A. 매개변수가 같으므로 오버라이딩 - 반환형이 다르다.(float와 void)
B. 메소드 명 같고 매개변수 다름(오버로딩)
C. 매개변수 같고 반환형 같고, 접근제한자 같음(오버라이딩)
D. B와 같은 이유로 오버로딩
21. if( true/false ) 가능... bool은 boolean형으로 if(bool=false)에서 false값 가짐 2번라인 실행안함. 4번도 false여서 실행안함. 6번은 if(!bool) 이 참이어서 "c"출력
22. 참인것은? (혼란스러움)
A. catch(X x)는 서브클래스 X를 catch할 수 있다.
B. Error class는 RuntimeException이다(Error다)
C. Error를 throw하는 어떤 문장이라도 try block로 싸 주어야 한다.(Error는 싸 줄 필요 없다)
D. Exception을 throw하는 어떤 문이라도 try block로 싸 주어야 한다.(throw하는 문을 호출해도 메소드에 throws를 사용하면 try~catch를 다른 메소드에 넘길 수 있다.)
E. RuntimeException을 throw하는 어떤 문이라도 try block로 싸 주어야 한다.(D와 동일)
Q23.
A. 어서션은 부작용이 없다.
B. Assertion(검증)표현하는 values는 어떤 기본형이라도 가능하다.(assert 조건문:String 으로 제한)
C. ?
D. assertion의 결과로 AssertionError를 thrown하는감싸진 메소드로 다루어져야한다.(X)
24.생성자의 경우 패키지의 접근제한자와 동일해야 한다. 그렇지 않으면 클래스 생성 자체가 불가능하다고 에러가 난다.
A. Compilation fails at line 5.
Q25.
코드 주의: TestSuper(int i){}로 생성자 명시 default 생성자 만들지 않음. TestSub는 TestSuper를 상속(extends)함
new TestSub() 시 생성자가 실행될 때 따로 명시하지 않으면 부모(TestSuper)의 default생성자를 호출한다. 그러나 TestSuper에는 디폴트 생성자가 없으니 에러가 난다.
!-- 요건 주요한 내용이라 스크랩
|
||
|
|
|
|
||
|
||
|
|
|
|
|
|
|
|
출처: <http://www.indiabix.com/c-programming/questions-and-answers/>
장길석
http://forum.falinux.com/zbxe/index.php?document_srl=557139
2011.10.07 22:30:31 (*.138.143.120)
26142
C 언어를 사용하신다면 struct는 아마도 대부분 사용하실 것이라고 생각됩니다. 그런데 의외로 사용하지 않는 것이 있는데 바로 union입니다. 흠~ 이유가 뭘까? 아마도 struct 보다는 사용하는 경우의 수가 적기 때문이 아닐까 생각합니다. 그런데 문제는 사용할 꺼리가 적다 보니 잊혀져 버리는 것 같아요. 아무리 멋진 자동차도 쳐다 보지 않고 내팽게쳐 준다면 녹이 슬고 말겠죠.
union이 그런 것이 아닐까 생각됩니다. 사용하면 편한데, 사용하는 경우가 적다 보니 잊혀져서 사용하지 못하는. 그러나 아예 잊혀지기 전에 잠시 둘러 보죠.
저 같은 겨우 union을 시리얼 통신이나 TCP/IP 통신에서 가끔 사용합니다. 혹시, 이런 경우 있지 않나요? 시리얼로 한 바이트씩 정수 값을 받아 들이는 경우 말이죠.
- 상대방이 보내려는 정수 값 : 0x12345678
- 상대방이 하나 씩 보낸 순서 : 0x12, 0x34, 0x56, 0x78
이럴 때 union을 사용하면 편한데, 대부분 버퍼로 받아서는 직접 계산을 하더군요.
n_size = buff[3] * 256 * 256 * 256 + buff[2] * 256 * 256 + buff[1] * 256 + buff[0]
또는 비트를 shift 하기도 하지만, 어찌되었든 같은 방법입니다. 그러나 union을 사용하면 매우 간단해 집니다.
#include <stdio.h>
typedef unsigned char byte;
typedef unsigned int u32;
typedef struct {
byte b1, b2, b3, b4;
} size_byte_t;
typedef union {
u32 size;
size_byte_t bytes;
} size_data_t;
int main( void){
size_data_t s_size;
// 시리얼로 4개의 바이트를 buff[]로 받았다면
s_size.bytes.b1 = buff[0];
s_size.bytes.b2 = buff[1];
s_size.bytes.b3 = buff[2];
s_size.bytes.b4 = buff[3];
printf( "data size =%x\n", s_size.size);
return 0;
}
struct와 union의 차이점
struct는 변수를 하나의 묶음으로 만들어 줍니다. 묶음 하나에 들어 가도 변수는 다른 변수와 같이 들어 갈뿐 자기 자리가 있습니다. 즉, 사탕 4개를 struct라는 주머니에 넣는다면, 사탕은 모두 주머니 안에 들어가도 각각의 사탕은 자기가 차지하는 공간이 있습니다. 그러나 union은 큰 놈 안에 작은 놈이 포개지듯이 들어 갑니다.
그래서 아래와 같이 선언하면 struct로 선언된 struct_byte_t의 크기는 4byte 이지만, union으로 선언된 union_byte_t는 변수가 4개라도 byte 한 개 짜리입니다. 즉, b1, b2, b3, b4 이름만 다른 변수 4개만 있을 뿐 실제 모두 같은 바이트의 주소를 가르키게 됩니다.
typedef unsigned char byte;
typedef unsigned int u32;
typedef struct {
byte b1, b2, b3, b4;
} struct_byte_t;
typedef union {
byte b1, b2, b3, b4;
} union_byte_t;
자, 그렇다면 위의 예제가 그림처럼 이해가 되시나요? ^^
typedef struct {
byte b1, b2, b3, b4;
} size_byte_t;
typedef union {
u32 size;
size_byte_t bytes;
} size_data_t;
그래서 메모리에는 아래와 같이 포개지는 꼴이 됩니다.
이런 메모리 구성으로 b1에 값을 넣으면 size 변수의 최 하위 바이트 값이 변경됩니다. size 변수의 최 상위 바이트 값을 변경하려면 b4를 이용하면 되겠지요.
이해를 돕기 위해 예제 하나를 더 올립니다.
#include <stdio.h>
typedef unsigned char byte;
typedef unsigned int u32;
typedef struct {
byte b1;
byte b2;
byte b3;
byte b4;
} size_byte_t;
typedef union {
u32 size;
size_byte_t bytes;
} size_data_t;
int main( void){
size_data_t s_size;
s_size.size = 0x12345678;
printf( "b1=%2x b2=%2x b3=%2x b4=%2x\n", s_size.bytes.b1, s_size.bytes.b2, s_size.bytes.b3, s_size.bytes.b4);
return 0;
}
어떤 값이 출력될까요?
참고로 char buff[255]와 같이 크기가 정해진 버퍼와도 union을 이용하여 묶어서 사용하면 앞서 정수 값을 계산할 필요도 없어 집니다. 이 예 말고도 리틀엔디언 정수 값을 빅 엔디언으로 바꿀 때도 사용할 수 있구요. 결론으로 짧게 말씀 드린다면, 어떤 고정 크기의 변수에서 특정 부분을 수정하거나 읽어 들일 때 사용하면 편합니다.
출처: <http://forum.falinux.com/zbxe/index.php?document_srl=557139&mid=lecture_tip>
void ( )(int);
void (*func)(int)
*signal(int signo)
void (*signal(int signo,void (*func)(int))) (int);
*T = *signal(int signo,void (*func)(int)) 치환
void (*T) (int);
반환형이 없고(void), 하나의 int 형 인수를 가지는 함수를 가리킬 수 있는 포인터 => 함수 포인터
*S = void (*func)(int)
반환형이 없고(void), 하나의 int 형 인수를 가지는 함수를 가리킬 수 있는 포인터 => 함수 포인터
*signal(int signo, *S)
int 와 함수포인터 *s를 인자로 하는 함수를 가리킬 수 잇는 포인터 => 함수 포인터
signal 함수 선언의 뜻은?
void (*signal(int signo,void (*func)(int)))(int);
예제를 void (*a)(int), a= signal(int signo, void (*handler)(int)) 두개로 나누어 봅시다.
그러면 a는 함수의 리턴벨류를 의미하며 <integer형을 argument로 하고 return 값이 없는 함수 포인터 a> 라 할수 있습니다.
근데 signal이란 놈은 <integer 하나, integer를 인자로 하고 리턴값이 없는 handler라는 이름의 함수 포인터 하나를 인자로 하는 signal이라는 이름의 함수>입니다.
이 둘을 결합하면 결국,
a = <integer형을 인자로 하고 return값이 없는 함수포인터를 리턴값으로 가지며 (integer 하나), (integer를 인자로 하고 리턴값이 없는 handler라는 이름의 함수포인터 하나)를 인자로 하는 signal이라는 이름의 함수 >입니다.
2. signal을 가르키는 함수 포인터 선언은?
위와 같이 선언자체와 리턴 값을 둘로 나누어 봅시다.
void (*) (int) -> return value;
(* signal)(int, void (*) (int)); -> return value를 제외한 함수 포인터
둘을 합하면
void (* (* signal)(int, void (*) (int)) ) (int)
와 같이 됩니다.
이것은 signal과 같은 함수를 가르킬 수 있는 함수 포인터입니다.
Let's making English culture to read English documents for upgrading your ablity of coding quickly.
답변
추천해요3
추천자 목록
^ - Circumflex (서컴플렉스)
! - Exclamation Point (엑스클러메이션 포인트)
" - Quotation Mark (쿼테이션 마크)
# - Crosshatch (크로스해치), Sharp(샵), Pound Sign(파운드 사인)
$ - Dollar Sign (달러사인)
% - Percent Sign (퍼센트사인)
@ - At Sign (앳 사인, 혹은 앳), Commercial At(커머셜 앳)
& - Ampersand (앰퍼샌드)
' - Apostrophe (어파스트로피)
* - Asterisk (애스터리스크)
- - Hyphen (하이픈), Dash (대시)
. - Period (피리어드), Full Stop (풀스탑)
/ - Slash (슬래시), Virgule (버귤)
\ - Back Slash (백슬래시)
- Won sign (원사인)
: - Colon (콜론)
; - Semicolon (세미콜론)
` - Grave (그레이브)
{ - Left Brace (레프트 브레이스)
} - Right Brace (라이트 브레이스)
[ - Left Bracket (레프트 브래킷)
] - Right Bracket (라이트 브래킷)
( - Left Parenthesis (레프트 퍼렌씨시스)
) - Right Parenthesis (라이트 퍼렌씨시스)
| - Vertical Bar (버티컬바)
~ - Tilde (틸드)
= - Equal Sign (이퀄사인)
+ - Plus Sign (플러스사인)
- - Minus Sign (마이너스사인)
_ - Underscore (언더스코어), Underline (언더라인)
< - Less Than Sign (레스댄 사인), Left Angle Bracket(레프트 앵글브래킷)
> - Greater Than Sign (그레이터댄 사인), Right Angle Bracket (라이트 앵글브래킷)
출처: <http://tip.daum.net/question/39482504>
https://money.cnn.com/pf/best-jobs/2013/snapshots/7.html
/* object type (public) */
typedef union {
struct _ooc_vtbl_object const *_CONST__ __vptr;
struct _ooc_vtbl_object _CONST_*_CONST_ __iptr;
} t_object;
/* object virtual table type (private) */
struct _ooc_vtbl_object {
struct _ooc_type_info const*_CONST_ info;
size_t offset;
};
/* object class type (private) */
struct _ooc_class_object {
struct _ooc_vtbl_object const*const __vptr;
t_object (*const object) (void);
void (*const _object) (t_object *const);
};
/* object RTTI (private) */
struct _ooc_type_info {
char const*const name;
struct _ooc_class_object const*_CONST_ class;
t_object const*_CONST_ obj;
struct _ooc_type_info const*_CONST_ super;
size_t _CONST_ extraSuper;
size_t _CONST_ extraOffset[_OBJECT_MAXEXTRASUPER_];
};
'살며 생각하며,' 카테고리의 다른 글
개 발 일 지 029 (0) | 2019.11.24 |
---|---|
개 발 일 지 028 (0) | 2019.11.24 |
개 발 일 지 025 (0) | 2019.11.20 |
개 발 일 지 023 (0) | 2019.11.18 |
개 발 일 지 022 (0) | 2019.11.17 |
최근댓글