JAVA 3일차

MOZZI KIM·2022년 10월 26일
0

JAVA

목록 보기
3/21
post-thumbnail

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

  • 상수 (constant) : 변하지 않는 값
  • 변수 (variable) : 변하는 값

2. 초기화란?

Java에서 초기화 뜻은?

  • 선언한 객체에 최초로 값을 넣어주는 것.

자바에서 초기화 하는 이유는?

  • 클래스 영역에서 선언할 경우에 컴파일러가 자동으로 값 할당을 해주지만,
    메소드 영역에서 선언할 경우에는 자동으로 값이 할당되지 않기 때문에 에러가 발생하기 때문이다.
//변수의 선언과 초기화 예시

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. 리터럴이란?

리터럴(literal)
변하지 않는 데이터 그 자체
자료형을 기반으로 표현이 되는 상수

int num = 5 + 7; //5와 7은 '정수형 리터럴'
double num2 = 3.3 + 4.5; //- 3.3 4.5는 '실수형 리터럴'
char ch = 'A' //A는 '문자형 리터럴'


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

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

정수 리터럴은(3147483647 : 이것도 리터럴) 기본적으로 int형이다.
여기서는 이미 연산 전의 정수 리터럴이 int의 범위를 넘어서 오류가 난다.
리터럴 상수에서 숫자 뒤에 L(소문자l도 상관없음)붙이면 long형(8byte)으로 인식해서 long형 상수로 표현해 달라고 요청 하는 것이다.

//이렇게 해야 오류 안남.
System.out.println(3147483647L + 3147483648L);

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

형 변환(casting)

  • 자료형 변환의 의미와 필요한 이유는 기본적으로 연산 시킬때 두 데이터 타입이 반드시 일치해야 하기 때문이다. 형변환은(자료형크기x 범위o) 크고, 소수점은 보존하는 방향으로 이루어진다.
int num1 = 50;
long num2 = 3147483647L //<-21억넘음
sysout(num1+num2); //num1에 저장된 값이 long형으로 형 변환된다. (자동형변환)

/*두 피연산자 자료형이 일치하지 않을 때 형 변환으로 일치 시켜야 한다. 
자동으로 오류 없이 컴파일 된다면 어느 한쪽으로 자동 형 변환이 일어난 것이다. 
정수와 정수의 연산 에서는 데이터 타입이 큰 쪽으로 맞춘다.
(int 보다 작은 데이터 타입은 다 int로 바뀐다.)
강제 형 변환을 하게 될 경우에는 값을 자른다. 
자를 때는 앞 부분을 삭제하고 뒤에 있는 바이트가 사용된다.*/

자동형변환(Implicit Conversion)

  • 자료형의 크기가 일치하지 않지만 강제로 변환하지 않아도 묵시적으로 형 변환이 되는 것을 말한다. 작은 데이터 타입이 큰 쪽으로 변경되거나, 정수형이 실수형으로 변하는 것만 가능하다.

규칙

  • 1) 자료형 크기가 큰 방향으로 형변환 일어남
    2) 자료형 크기에 상관없이 정수 자료형보다 실수 자료형 우선(소수점 보존)
    원래의 값을 최대한 보존하는 쪽으로 형변환한다.
long num1 = 3; //4 byte
float num2 = 22.1f; //8byte
Sytem.out.print(num1+num2); 
//float형으로 자동형변환
// 소수점을 보존과 적은 메모리에 더 많은 수를 표현 가능(범위가 더 넓다) 해서 float로 형변환

명시적형변환(Explicit Conversion) : 강제적 형변환

  • 자동형변환 규칙에 부합하지 않지만 형변환이 필요한 상황이면 명시적으로 형변환을 진행한다.
    이 경우는 데이터가 큰 타입을 작은 타입으로 형 변환을 하는 것도 가능하지만, 실제 데이터의 변형이 일어날 수 있기 때문에 주의해야한다.
//명시적 형변환 예시
double pi = 3.12415;
int wholeNumber = (int)pi; //정수형 소수점 버리고 결과값은 3

short num1 = 1;
short num2 = 3;
short num3 = (short) (num1 +num2); //num1과 num2 int로 계산될건데 short로 강제 형변환
int num4 = (int)num1;

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

int a = 3;
int b = 4;

double c = a / b;
System.out.println(c); //결과 : 0.0
/*
int 연산 결과는 int인데(소수점 날림) 그 값을 num3으로 대입 하면서 double로 대입해서 .0이 붙게 된다. 
원하는 결과값 0.75를 얻기 위해서는 num1, num2의 자료형 중 하나는 double로 선언해야 한다.*/

double result = a/ (double)b
System.out.println(c); //결과 : 0.75


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


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

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

//결과 : A 와 130이 나옴.
/*'A'(리터럴)를 뿌리기 위해 메모리에 방을 잡아야 한다. 
이때 데이터 타입이 필요하고 A에 대한 데이터 타입은 char, 
메모리에는 아스키코드 값 65가 들어간다. 그래서 65+65 = 130이 출력된다.*/

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


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

int num;
boolean result;
result = (num > 1) && (num < 100);

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

int num;
boolean result;
result = (num % 2 == 0 ) || (num % 3) == 0);

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


13. 아래의 프린트 결과를 예측해 보고, 코딩 후 결과를 확인 하시오

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); //false
    System.out.println("num1 = " + num1);
    System.out.println("num2 = " + num2 + '\\n');

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

//이유 (논리 연산자 사용시 주의점)
result = ((num += 10 < 0)) && ((num2 += 10) >0);
//둘다 t여야 t이니까 앞에서 이미 false결정되어 뒤에 연산 안함 
//num = 10; num2 = 0;

result = ((num += 10 < 0)) || ((num2 += 10) >0);
//둘중 하나만t면 t니까 앞에서 이미true결정되어 뒤에 연산안함
//num = 20; num2 = 0;
//하지만 연산한 결과는 변수에 반영 된다. 그러므로 다음 연산시에 변한 값이 다시 반영된다._

 

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

short num1;
short num = -num;

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

//수정
short num = 100;
num = (short)(-num); //강제 형변환을 해줘야한다.

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



16. 비트 연산자.



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



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

class AssignSteResult {
public static void main(String[] args) {
int num1 = 10, num2 = 20, num3 = 30;
num1 = num2 = num3;

예상결과 30, 30, 30

  • = 연산자는 결합 방향이 오른쪽에서 왼쪽으로 진행된다.
    따라서 위의 문장은 다음과 같다.
  • num1 = (num2 = num3);

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); // false
    System.out.println("num1 = " + num1); //num1 = 10;
    System.out.println("num2 = " + num2 + '\\n'); //num2 = 10;
    
    num1 += 10; 
    num2 += 10;
    result = (num1 > 0) || (num2 > 0);

    System.out.println("result = " + result); //true
    System.out.println("num1 = " + num1); //num1 = 20
    System.out.println("num2 = " + num2); //num2 = 20
  }
}

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

class AddNum {
  public static void main(String[] args) {
  
    int result = 3 + 6;
    
    System.out.println("3 + 6 = " + result); //9
    
    result += 9;
    System.out.println("3 + 6 + 9 = " + result); // 18 (9+9)

    result += 12;
    System.out.println("3 + 6 + 9 + 12 = " + result); //30 (18+12)
  }

}

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


int kor = 90;
int math = 70;
int eng = 80;
int total = kor + math + eng;
double avg = total / 3.0; //소수점 표시하기위해 3.0으로 한다.

System.out.println("국어 : " + kor + "\n수학 : " + math + "\n영어: " + eng 
+ "\n총점 : " + total + "\n평균 : " + avg);  

//출력값
국어 : 90
수학 : 70
영어: 80
총점 : 240
평균 : 80.0
profile
코린이

0개의 댓글