Acorn Academy 11/29 Java

Bae Seong Jun·2023년 11월 29일

Acorn academy

목록 보기
9/70

멤버변수, 인스턴스변수, 전역변수
0. 사용시 new 키워드로 객체 생성 후 사용
1. new 키를 이용하여 객체 생성할 때 멤버(인스턴스)변수가 생성 후 참조변수에 생성된 객체의 주소 저장 후 참조하여 사용
? 멤버변수? 참조변수 ?
2. 전역변수 : 클래스 전체에서 사용 가능, 객체생성시 참조변수를 이용하여 사용
3. 선언만 해도 객체 생성(new)시 자동으로 초기화 됨
자동초기화 됨으로 객체생성 후 초기화 없이 바로 사용가능
정수 0 실수 0.0 char공백 String:null boolean false로 자동초기화 됨

참조변수 : 참조변수는 실제 데이터를 가지는 것이 아니라 참조하는 객체의 주소값을 저장한다.


public class Sample02_variable5_3 {
	String name;
	char gender;
	int age;
	boolean married;
	double height;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Sample02_variable5_3 test = new Sample02_variable5_3();
		System.out.println(test); 
	}

}

객체 변수와 클래스 변수의 차이점 자세히 정리 : https://java119.tistory.com/20

static이 정확히 뭘까?
정적(static)과 힙(Heap)
참조 : https://coding-factory.tistory.com/524

참조 데이터 형 (Reference Date Type : RDT )

값이 아니라 데이터의 주소값을 저장하는 데이터 형이다.

8개의 기본형에 속하지 않는 모든 데이터형이 참조 데이터에 속한다.
대표적으로 클래스, 배열, 인터페이스이다.
String 클래스는 문자열을 저장하지 않고 주소가 저장되어있다.

데이터 형변환

묵시적 형변환

자동형변환, promotion

작은 크기의 데이터형의 데이터값 -> 큰 크기의 데이터형으로 형 변환이 가능
char -> int

명시적 형변환

강제 형 변환 또는 ‘type casting' 이라고 한다.
강제적으로 데이터형을 변경하는 개념이
기 때문에 데이터 손실이 발생할 수 있다.
기본 데이터 형 및 참조 데이터 형 모두 가능하다.
형 변환 연산자를 사용한다. 연산자는 소괄호를 사용하고 소괄호 안에 변환하려는 데이터형을 지정하면 된다.

연산시의 데이터형 변환

정수의 기본형인 int보다 작은 타입끼리의 연산 결과는 항상 int형으로 자동 변환된다.
ex) short 타입으로 연산시 결과값은 int형으로 자동형변환됨

문자열을 정수로 변환

상수

final을 접두에 붙여서 선언
선언과 동시에 초기화가 필수임
값을 변경할 수 없음
일반적으로 상수의 이름은 대문자로 표기함. (권장)

final int NUM = 10;

변수와 코드블록 ( code block )

{}로 묶는 것을 코드 블록이라고한다.
해당 코드블록 내에서 선언한 변수는 해당 블록이 끝나면 소멸한다.
코드 블록은 클래스, 매서드, 생성자, 조건문, 반복문 등 다양하게 사용가능하다.
{}만 독립적으로도 사용가능하다.
블록간에는 서로 다른 영역으로 처리되기 때문에 같은 이름을 가진 변수를 포함할 수 있다.

연산자

목차
1. 산술 연산자
2. 비교 연산자
3. 대입 연산자
4. 증감 연산자
5. 논리 연산자
6. 3항 연산자

산술 연산자

산술 연산자 종류 : +-*/%

  • 정수와 정수의 연산결과는 정수형으로 반환됨

  • 실수가 포함된 연산결과는 실수형으로 반환됨

  • 실수연산의 가장 큰 문제점은 결과값이 부정확하다는 것이다.
    다음 코드의 실행결과는 1.9가 아닌 0.8999999999999999 값이 출력된다
    ex ) 2.0-1.1
    이러한 문제점을 해결하기 위해서 다음과 같은 BigDecimal 클래스를 사용할 수 있다

import java.math.BigDecimal;

public class Sample09_double {

	public static void main(String[] args) {
		double a=0.1;
		double b = 0.2;
		System.out.println("오류 :" + (a+b));
		
		BigDecimal m = new BigDecimal(2.0);
		BigDecimal m2 = new BigDecimal("1.1");
		System.out.println(m.subtract(m2));
	}

}

여기서 의아한 점이 있다. BigDecimal 객체 생성시 실수값을 문자열로 굳이 넣지 않아도 오류가 발생하지 않는데 이때는 사실 BigDecimal을 쓰지 않고 계산할 때 생기는 문제가 그대로 생기게 된다. 고로 실수값을 문자열로 변환후 해당 메소드를 사용해야한다.

// double 타입을 그대로 초기화하면 기대값과 다른 값을 가진다.
// 0.01000000000000000020816681711721685132943093776702880859375
new BigDecimal(0.01);

// 문자열로 초기화하면 정상 인식
// 0.01
new BigDecimal("0.01");

BigDeciaml.(multiply(),devide(),subtract(),add())

임포트 쉽게 하는 법 : ctrl + shift + O (자동 임포트 단축키)

비교 연산자

같다 ==
부등호 > < >= <=
같지 않다 !=

반환값 true/false

만약 다음과 같이 두 개의 변수에 저장된 동일한 문자열이 같은지를 비교하기 위해서는 ==
연산자를 사용하지 말고 equals() 메서드를 반드시 사용해야 한다. 이 내용은 8장의 String
클래스를 참조한다.

내가 알고있는 문자열 비교를 ==으로 하면 안되고 equals() 메서드를 써야하는 이유 :
String 타입의 데이터는 참조변수라서 값을 저장하지 않고 주소를 저장하기 때문일 것 같다.
따라서 값이 동일한지만을 판단하기 위해서는 equals()메소드를 사용해야할 것이다.

문자열의 주소값을 찾는 방법은 좀 복잡한 것으로 추정됨
참고 : https://okky.kr/questions/611080

대입 연산자

변수에 새로운 값을 저장하는 경우에 사용되는 연산자이다. 변수에 기존값을 바로 저장할
수도 있고 더해서 저장하거나 빼서 저장하는 것처럼 산술연산해서 저장할 수 있는 방법이
다.
=, +=, -=, *=, /=, %=

증감 연산자

기존 변수가 가지고 있는 값을 1 증가하거나 또는 1 감소하는 경우에 사용하는 연산자이다. 증감연산자는 단항연산자로서 변수의 앞 또는 뒤에 올수 있다. 변수의 앞에 붙이면 전위 연
산자라고 하며, 이때에는 연산하기 전에 변수의 값을 먼저 증가시키거나 감소시키고 나중에
연산을 하게 된다. 변수의 뒤에 붙이면 후위 연산자라고 하며 연산 후에 변수의 값을 증가
시키거나 감소시킨다. 증감 연산자는 다른 연산자와 사용할 경우에 전위 연산자 및 후위 연
산자에 따라서 연산 결과 값이 달라질 수 있기 때문에 주의해서 사용한다.
++, --

논리 연산자

논리 연산자는 true와 false값을 이용하여 논리연산을 수행하는 연산자로서, 연산결과는 비
교 연산자와 마찬가지로 반드시 논리 값이다. 따라서 boolean 데이터형의 변수로 저장할 수
있으며 if문 , while문 같은 제어문의 조건검사에 주로 사용된다.
&& AND 연산자
|| OR 연산자
! NOT 연산자

데드코드 : 이미 결론이 난 && 구문 같은 곳에서 추가적으로 계산될 필요가 없어서 실행되지 않는 구문.

		String name=null;
		System.out.println((4<2)&&(name.length()==4));
		System.out.println((4>2)&&(name.length()==4));

name변수에 null이 저장되어있다.
null의 length()를 구하려고하면 실행은 되지만 막상 실행하면 오류메세지가 뜬다.
에러메세지 : NullPointerException
하지만 2번째줄은 첫번째 조건문부터 false가 되었기 때문에 뒤의 구문이 데드코드처리되어 실행되지 않는다. 고로 분명 문제가 있는 구문이지만 오류가 발생하지 않는다.
3번째 줄은 반면에 오류가 터진다.

이클립스의 Dead code란 전혀 실행되지 않는 코드를 의미한다. 일반적으로 조건에 따른 분기문에서 발생한다.
dead code는 이클립스 IDE가 성능이 너무 좋아서 나오는 경고라고 하셨다.
데드코드 자세한 사항 : https://hojak99.tistory.com/401

3항 연산자

문법
변수 = (조건식)? 값1 : 값2;
조건식이 참일시 값1을 반환, 거짓일시 값2를 반환한다.
3항 연산자는 중첩이 가능하다.

자주 쓰이는 큰 값 구하기 간편식

int result = (a1>b1)? a1:b1;

값의 입력

ctrl + shift + o 로 자동 임포트

import java.util.Scanner;

public class ScannerTest {

	public static void main(String[] args) {
		System.out.println("이름을 입력해주세요");
		Scanner scan = new Scanner(System.in);
		String name = scan.next();
	}

}

글입력대기 => 입력데이터 String으로 받아줌
입력받은 값은 문자열이니 다른 데이터로 변경하고싶으면 추가적으로 명시적으로 데이터형을 변경해주어야한다.
String name = Integer.parseInt(scan.next())
int age = scan.nextInt();

아래 코드는 2개 값의 홀짝을 판단하고 두 값 중에 최대값을 판단

import java.util.Scanner;

public class ScannerTest4 {

	public static void main(String[] args) {
//		System.out.println("첫번째 숫자");
//		Scanner scan = new Scanner(System.in);
//		int num = Integer.parseInt(scan.next());
//		System.out.println((num%2 == 1)?"홀":"짝");
//		
//		System.out.println((Integer.parseInt(scan.next())%2 == 1)?"홀":"짝");
//		scan.close();
		
		Scanner scan= new Scanner(System.in);
        System.out.println("첫번째 숫자 :");
        String s_num= scan.next();
        int result= Integer.parseInt(s_num)%2;   //문자열 숫자를 정수로 변환 함수 중요함.
        System.out.println((result==0)?"짝":"홀");
        
        int num= scan.nextInt();
        int result2= num%2;
        System.out.println((result2==0)?"짝":"홀");
        
//        int max = (Integer.parseInt(s_num)>num)? Integer.parseInt(s_num) : num;
//        String max = (Integer.parseInt(s_num)>num)? s_num : String.valueOf(num);
        String max = (Integer.parseInt(s_num)>num)? s_num : num+"";
        System.out.println("max 값 : " + max);
        scan.close();
	}

}
profile
코딩 프로?

0개의 댓글