JAVA 3일차(221026)

점햠미·2022년 10월 26일
0

JATBAP'S JAVA

목록 보기
3/22
post-thumbnail

1. 상수란 무엇이며 변수와의 차이는?

변수는 변하는거 상수는 안변하는거

2. 초기화란 무엇인가?

변수의 초기화의 의미는 해당 변수에 처음으로 값을 넣는 것이다.
변수의 경우 초기화 이후에 값을 넣어 변화시킬 수 있으나, 
상수는 초기화 이후 값을 넣거나 변경시킬 수 없다.

//변수의 선언과 초기화 예시
int a = 1; //변수의 선언과 동시에 초기화
char ch = 'a'; //변수의 선언과 동시에 초기화
int b; //변수의 선언
b = 5; //초기화

//상수의 선언과 초기화 예시
final int MAX_SIZE = 100; //상수의 선언과 동시에 초기화
final char CONST_CHAR = '상'; //상수의 선언과 동시에 초기화
final int CONST_ASSIGNED; //상수의 선언
CONST_ASSIGNED = 12; //상수의 초기화

CONST_ASSIGNED = 30; //에러. 상수는 한번만 값을 할당할 수 있다.

3. 리터럴이란 무엇인가요?

리터럴(Literals)은 자료형을 기반으로 표현이 되는 상수를 말한다.
int num = 5 + 7; //5와 7은 '정수형 리터럴'
double num2 = 3.3 + 4.5; //- 3.3 4.5는 '실수형 리터럴'
char ch = 'A' //A는 '문자형 리터럴'

위에서 5나 7, 3.3, 4.5 모두 연산을 위해서 CPU로 보내기 위해 메모리에 올리는 
과정이 동반된다. 그렇기 때문에 5와 7은 int형으로 4byte의 메모리 공간을 할당받게 
되고 3.3과 4.5는 double형으로 8byte의 메모리 공간을 할당받게 된다. 
이렇게 메모리 공간을 확보한 정수와 실수 모두는 메모리 공간에 값이 기록되면 
값이 변하지 않기 때문에 리터럴 이라고 표현한다.
(리터럴이라는 표현은 상수라는 표현으로 대신하는 경우가 많다.)

참고
정수형 리터럴(예시)
//long형 - L 써야함

long l = 3147483647L;
sysotu(3147483647 + 3147483647);
//=> integer number too large 오류메세지 출력

//이진수로 넣으려면 -OB또는 ob붙여서 이진수 표현
byte seven = 0B111; //10진수로 7
int num205 = 0B11001101;

//원하는 위치에 언더바를 넣을 수 있다.
//언더바는 가독성을 위해 넣어주는 것일 뿐, 아무 영향이 없다.
int num = 100_000_000;
int num = 12_34_56_78_90;

실수형 리터럴(예시)
sysout(3.0004999 + 2.0004999);
sysout(3.0004999D + 2.0004999d);
//실수는 기본 double형이다. double임을 명시하기 위해 d또는D삽입 (안넣어도 됨)

sysout(3.0004999F + 2.0004999f);
//실수형 상수를 float형으로 표현하려면 f나 F삽입 (꼭!)

Boolean, 문자형 상수 (예시)
true false: 부울형 상수 (boolean)
'한' '글' 'A' 문자형상수

4. 아래의 내용이 에러가 나는 이유와 수정 방법은?

System.out.println(3147483647 + 3147483648); //에러남

-> 범위가 int로는 표현 못하고 long인데 long은 숫자 뒤에 L/l(대소문자 관계 X)을 붙여야함.

System.out.println(3147483647L + 3147483648L);

로 수정하면 에러 X

5.자동 형변환과 명시적 형변환에 대하여 설명하시오.

자동 형변환
명시적 형변환

6.아래의 에러가 나는 이유를 설명하고 수정 하시오.

int a = 3;
int b = 4;
double c = a / b;

System.out.println(result);

-> double로 형변환 해줘야함. 글고 result 선언한게 없음

int a = 3;
int b = 4;
double c = (double)a / b;

System.out.println(c);

-> 출력값 0.75

int a = 3;
int b = 4;
double c = (double)(a / b);

System.out.println(c);

-> 출력값 0.0

7. 이스케이프 시퀀스의 종료를 나열하고 기능을 설명하시오.

이스케이프 시퀀스는 특수 문자로, 백 슬러시 뒤에 문자가 오는 것들을 말한다.
(화면상의 어떠한 상황 또는 상태를 표현하기 위해 약속된 문자)

\b 백스페이스 문자 back

\t 탭 tab

\\ 주석처리

\" 작은따옴표문자

\" 큰따옴표문자

\n 개행 line new

\r carrige return :커서를 처음으로 옮겨서 그 자리에 있던 문자를
지우면서 쓰고 개행도 시킴. 결과로 cb나옴 
(타자기에서 한번씩 치면 땡기면서 한 칸아래 맨 앞줄로 이동하는 것처럼)

8. 아래의 출력 결과를 확인하고, 130이 나오는 이유를 설명하시오.

System.out.println('A'); 
//char형으로 인식, 메모리에 올라갈 때 65값이 들어감
System.out.println('A' + 'A'); 
//char형으로 65메모리에 올리고, int형으로 자동

-> A의 아스키코드 값 = 65.
int로 자동 인식돼서 숫자 값을 더함
65 + 65 = 130

9. 결합 방향과 우선순위에 대하여 설명하시오.

기본적으로 연산을 할 때는 우선 순위와 결합 방향에 따라 다르게 연산이 이루어진다.

기본 원칙
1) 연산자 우선순위가 높은 것을 먼저 계산한다.
2) 우선순위가 같다면 결합 방향에 따라 연산된다.
- 기본적으로 연산자 우선순위에서 가장 높은 것은 괄호이다.

int a = 6+ 7;
/*
+연산의 우선순위가 =연산의 우선순위보다 높다.
1. +연산을 먼저하고
2. a에 대입한다.
*/

참고: 연산자 우선순위와 결합방향

10. "1초과 100미만인가?" 를 코딩 하면?

int num = nn;
boolean result;

result = (1 < num) && (num < 100);			
System.out.println("nn은 1 초과 100 미만인가? " + result);

-> 맞으면 true / 틀리면 false 출력

11. "2의 배수 또는 3의 배수?" 를 코딩 하면?

int num = nn;
boolean result;

result = ((num%2) == 0) || ((num%3) == 0);			
System.out.println("nn은 2의 배수 또는 3의 배수인가? " + result);

12. && 와 || 설명하시오.

&& -> 여러개의 조건이 다 들어 맞아야 True.
|| -> 여러개의 조건 중 하나만 맞아도 True.
  1. 아래의 프린트 결과를 예측해 보고, 코딩 후 결과를 확인 하시오.
class SCE {
  public static void main(String[] args) {

      int num1 = 0;
      int num2 = 0;
      boolean result;

      result = ((num1 += 10) < 0) && ((num2 += 10) > 0);
      System.out.println("result = " + result);
      System.out.println("num1 = " + num1);
      System.out.println("num2 = " + num2 + '\\n'); // "

      result = ((num1 += 10) > 0) || ((num2 += 10) > 0);
      System.out.println("result = " + result);
      System.out.println("num1 = " + num1);
      System.out.println("num2 = " + num2);
  }
}

-> False,10,0 / True,20,0

&&은 둘 다 True여야 True가 출력되는데 처음 시작부터 False가 나옴.
그래서 그 뒤에 있는 num2의 계산은 하지도 않고 끝남.
그래서 False가 출력되고 num1은 10이 더해진 값, num2는 0 그대로.

||은 둘 중 하나만 True면 True가 출력되는데 처음부터 True가 나와서 이미 참으로 밝혀졌으니까 그 뒤에는 계산을 안해버림.
num1은 위에 &&를 확인하면서 이미 10이 되어있었기 때문에 그 값에 또 10이 더해진 20이 나옴.
그리고 num2는 이번에도 값이 더해지지 않았기 때문에 그대로 0.

14. 아래가 에러가 나는 이유를 설명하고, 수정 하시오.

short num1;
short num = -num;

num은 원래 short이지만 -도 "부호연산자"로 하나의 연산이고 그래서 int형으로 자동형변환이 일어난다.

즉 -1 num 의 연산이 일어난다고 볼 수 있으며, int(4byte)형으로 변환된 num을 short(2byte)형 num으로 대입하려 했기 때문에 (더 작은 타입으로는 자동형변환이 불가능하다.)에러가 난다.

수정
short num = 100;
num = (short)(-num);

그래서 강제 형변환을 해줘야한다.

double e1 = 3.5;
double e2 = -e1; // e1에 저장되는 값은 -3.5

부호 연산자 –는 변수에 저장된 값의 부호를 바꾸어 반환한다.
+, - 가 붙는 것도 연산임을 기억하자. (정수는 2의 보수법으로, 실수는 복잡한 방법으로 연산되어 나오는 것임)

short num1 = 5;
System.out.println(+num1); //+5(+는 불필요한 부호)//형변환 필요없이 short로 받음
System.out.println(-num1); //부호를 바꿔 얻은 결과 출력

short num2 =7;
short num3 = (short)(+num2); // 1num2 라서 연산시 int로 변환됨//형변환 안하면 오류
short num4 = (short)(-num2); //-1num2 라서 연산시 int로 변환됨//형변환 안하면 오류

System.out.println(num3);
System.out.println(num4);

연산의 결과가 변수에 반영이 된 것인지 아닌지 주의해서 보자!

int num =1;
boolean result;

System.out.println(-num); //-1 num
System.out.println(num); //연산 결과를 저장한것이 아니기때문에 1이 나온다.

15. 전위 증가 연산자와 후위 증가 연산자의 차이는?

값을 더하고 출력하는지, 출력하고 값을 더하는지의 차이.
++a면 바로 더해진 값이 출력됨 
a++은 출력한 이후에 더해지는거여서 그 줄에서는 더해진 값으로 보이지 않고
그 다음 연산을 할 때 더해진 값이 보임.

16. 아래의 비트 연산자 4가지를 설명하시오. &,|,^,~

& - 둘 다 1이어야 1
| - 둘 중 하나라도 1이면 1
^ - 둘 중 하나만 1이면 1. 둘 다 0이거나 1이면 0
~ - 반전. 1010 이면 0101로.

17.쉬프트 연산자에 대하여 설명하시오.

<<
좌측으로 한 칸 비트 이동 (2의n승 만큼 값 변함 - 값 2배 증가) 
: 제일 앞 비트는 버리고 뒤는 0으로 채움

>>
우측으로 한 칸 비트 이동 (2의n승 혹은 2의 n승분의 1- 값을 2로 나눈 결과) 
: 제일 뒤 비트 버리고, 남는 앞 비트는 양수면0, 음수면 1을 채운다.
- 음수-양수 바뀌면 안되니까, 부호비트는 보존해준다. 0양1음수 .

18.아래의 출력값을 예측하시오.

class AssignSteResult {
	public static void main(String[] args) {

		int num1 = 10, num2 = 20, num3 = 30;
		num1 = num2 = num3;

=은 진행방향이 -> 이렇게 가니까 num3의 값인 30으로 출력.

19.아래의 출력값을 예측하시오.

class SCE {
  public static void main(String[] args) {

    int num1 = 0;
    int num2 = 0;
    boolean result;

    num1 += 10;
    num2 += 10;
    result = (num1 < 0) && (num2 > 0);

    System.out.println("result = " + result);
    System.out.println("num1 = " + num1);
    System.out.println("num2 = " + num2 + '\n');

    num1 += 10;
    num2 += 10;
    result = (num1 > 0) || (num2 > 0);

    System.out.println("result = " + result);
    System.out.println("num1 = " + num1);
    System.out.println("num2 = " + num2);

  }

}

F,10,10 / T,20,20

20. 아래의 출력값을 예측하시오.

class AddNum {
	public static void main(String[] args) {

      int result = 3 + 6;
      System.out.println("3 + 6 = " + result);

      result += 9;
      System.out.println("3 + 6 + 9 = " + result);

      result += 12;
      System.out.println("3 + 6 + 9 + 12 = " + result);

	}
}

9/18/30

21.국어 영어 수학 점수를 90 70 80 으로 넣고,총점과 평균을 구하시오.

	public static void main(String[] args) {
		int 국어 = 90;
		int 영어 = 70;
		int 수학 = 80;
		
		System.out.println("총점 : " + 국어+영어+수학);
		System.out.println("평균 : " + (국어+영어+수학)/3
   }
profile
인생 망함 개조빱임

0개의 댓글