스터디/KAKAOCLOUDSCHOOL

[JAVA] 개발자 지망생 스터디 - 30일차

shineIT 2022. 12. 13. 16:51

6. Console 출력하는 메서드

1) System.out.print(String Message) 

  • 메세지를 출력하고 다음 메시지를 이어서 출력

2) System.out.println(String Message)

  • 메시지를 출력하고 다음 메시지를 줄 바꿈 해서 출력

3) System.out.printf(String format, ... data)

  • format에 맞춰서 data를 출력함
> Java의 모든 객체는 toString 이라는 메서드를 소유하고 있는데 이 메서드는 객체를 문자열로 표현해주는 메서드 임
출력하는 메서드에 객체의 참조를 대입하면 toString 메서드를 호출한 결과를 사용함

> Java는 String과 다른 종류의 데이터를 + 연산을 할 수 있는데 이 경우 데이터의 toString 메서드를 호출해 그 결과와 결합을 함
"Message" + 10 => "Message" + "10" => Message10

> toString의 기본적인 내용은 자신의 클래스 이름과 해시코드의 결합임
그 이외의 내용이 나오는 경우는 Overriding하여 내용을 수정한 것

> 서식은 데이터를 출력하는 모양을 지정할 수 있음
자릿수를 확보해서 출력하거나 소수 출력 범위를 지정하는 것 등임.

💡 "C 언어"
절차적 프로그래밍 언어(영역이 정해져 있음) 
선언하는 영역 / 사용하는 영역 => 변수를 다 선언하고 밑에서 사용.
작업에 일관성이 있기 때문에 (다 만들어두고 실행) 속도가 빠름

package kakao.itoriginal.basic;

public class ConsoleDisplay {

	public static void main(String[] args) {
		//console에 메시지 출력
		System.out.println("Message");
		//메시지 와 데이터를 결합해서출력
		System.out.println("Data"+99);
		Integer i = 120;
		int [] ar = {10, 20, 30};
		System.out.println(i); //i.toString()의 결과를 출력
		System.out.println(i.toString());
		System.out.println(ar);
		//toString 이 재정의되지 않아서 해시코드가 출력됨
	}

}
실행 결과

 

Data Type

1. Data의 분류

1) 변경 가능 여부에 따른 분류

# immutable(read only) Data : 생성하면 수정할 수 없는 데이터
> Literal : 프로그래밍 언어가 데이터를 표현하기 위해서 정해준 방식, 사용자가 직접 입력하는 데이터
> Constant : 개발자가 의도적으로 읽기 전용으로 만든 데이터
        final DataType 이름 = 초기값

# Mutable Data : 생성한 후 상황에 따라 다른 데이터의 참조를 저장할 수 있는 데이터
> Variable
    생성
        DataType 이름;
        DataType 이름 = 초기값;

2) 저장되는 데이터의 종류에 따른 분류

> Value Type : 실제 데이터를 저장하는 타입
> Reference Type : 데이터의 참조(address 나 hash code 라고 하기도 하는데 요즘은 hash code 라고 하는 경우가 많음)를 저장하는 타입

3) 저장되는 데이터의 개수에 따른 분류

> Scala Type : 하나의 데이터만 저장하는 자료형인데 Java 에서는 Primitive Type 이라고 함
> Collection(Vector) Type : 0개 이상의 데이터를 저장하는 자료형으로 Java 에서는 Primitive Type을 제외하면 모두 Vector Type임

4) Data Type 기재 방법에 따른 분류

> Static Type : 변수나 상수를 선언할 때 자료형을 결정해야 하는 Type
"C", "Java"는 Static Type 언어
소스 코드 작성 단계에서 타입 불일치와 같은 오류를 검출할 수 있음
Kotlin 이나 Swift 같은 언어는 Dynamic Type 처럼 선언하지만, 실제로는 Static Type의 언어임
Template Programming을 이용해서 인스턴스를 생성할 때 Data Type을 결정하는 지원 - Java에서는 이러한 기능을 Generic 이라고 함

> Dynamic Type : 변수나 상수를 선언할 때 자료형을 기재하지 않고 데이터의 참조를 대입할 때 결정하는 Type
JavaScript 와 Python이 Dynamic Type 언어
코드의 양은 줄어듬

5) 최근의 분류

> 정형, 비정형, 반정형으로 나누기도 하며 NULL 이 저장 가능한(Optional) 자료형과 NULL이 저장되지 않는 자료형으로 나누기도 함 (현재 계속해서 진행중인 사항임)

2. Java의 자료형

1) 자료형의 분류

> Primitive Type(기본형) : 하나의 데이터를 저장하기 위한 자료형
> NonPrimitive Type : 0개 이상의 데이터를 대표하는 참조를 저장하기 위한 자료형

2) 생성

자료형 식별자이름;
자료형 식별자이름 = 초기 데이터;

3) 사용

> 식별자 이름을 이용해서 데이터에 접근
> Primitive 타입은 이름 자체가 데이터를 의미하며 NonPrimitive 타입은 이름이 데이터를 대표하는 위치를 의미함
> 초기값을 설정하지 않으면 초기값 설정만 가능하고 다른 용도로 사용하면 에러가 발생함

4) 명명 규칙

# Camel Case
> 클래스나 인터페이스 이름은 대문자로 시작
> 속성과 메서드 이름은 소문자로 시작
> 두개 단어 이상의 조합일 떄 두번째 단어의 시작은 대문자

# Snake Case
> 상수의 이름은 모두 대문자로 표현
> 첫글자는 영문이나 한글 그리고 $ 와 _ 가능
> 한글은 가능하지만 인코딩 문제로 잘 사용하지 않음
> 중간에 공백 불가능

5) 변수나 상수의 유효 범위에 따른 분류

# Local Variable
> 메서드 안에서 만들어진 변수로 데이터 저장 공간이 Stack
> 메서드 안에서만 사용 가능하고 메서드의 작업이 끝나면 메모리와 함께 소멸됨
> 자신이 만들어진 블럭 안에서만 사용 가능함

# Member(Instance) Variable
> 클래스 안 그리고 메서드 바깥에 static 이라는 keyword 없이 만들어진 변수
> 데이터의 저장 공간은 Heap 에 생성되고 인스턴스를 통해서만 접근이 가능함
> 인스턴스가 소멸되면 같이 소멸됨
> 인스턴스는 자신을 참조하는 데이터가 없으면 메모리 정리 대상이 됨

# Static Variable

> 클래스 안 그리고 메서드 바깥에 static 이라는 keyword 와 함께 만들어진 변수
> 데이터의 저장 공간은 Class(Static) 영역이 되고 클래스를 통해서 접근이 가능한데 자바에서는 인스턴스를 통해서 접근 가능
> 클래스는 한 번 로드되면 메모리에서 소멸되지 않기 때문에 한 번 만들어지면 

6) 자바의 기본 자료형

#boolean : true 아니면 false만 저장가능한 자료형, 다른 자료형과 호환이 안됨

✔️ 정수 자료형
# byte
: 1byte, -128~127 까지 저장 가능
# short
: 2byte, -32768~32767 까지 저장 가능
# char
: 2byte, 0~65535 까지 저장 가능, 저장을 할 때는 정수로 저장하고 출력할 때는 문자로 출력
# int
: 4byte, 21억 정도의 음수와 양수 저장 가능, 정수 리터럴의 기준형
# long
: 8byte
> 정수 리터럴은 그냥 숫자만 사용하면 10진 정수로 판단하고 int가 됨
> 정수 뒤에 L 을 붙이면 long 형 리터럴이 됨
> byte, short, char, int, long은 자신의 표현 범위보다 큰 데이터는 저장할 수 없음
> long 형 리터럴은 long에만 저장 가능
> 천단위 구분 기호는 _ 임 ex) 123_456_789L
> 정수 앞에 0 을 붙히면 8진수가 되는데 앞에 0 으로 시작하는 숫자를 사용할 때는 주의
> 정수 앞에 0x 를 붙히면 16진수가 됨
package kakao.itoriginal.datatype;

public class PrimitiveType {

	public static void main(String[] args) {
		// 정수를 저장하고 출력
		int x = 100;
		System.out.println("x:" + x);
		
		// 동일한 공간에서 동일한 이름의 변수를 2번 생성하면 에러
		// int x = 100;
		int y = 100;
		System.out.println("y:" + y);
		
		System.out.println("x:" + System.identityHashCode(x));
		System.out.println("y:" + System.identityHashCode(y));
		
		// 정수는 자신의 자료형 보다 큰 범위 데이터를 참조할 수 없음
		// x = 20000000000;
		
		// 21억보다 크거나 -21억 보다 작은 정수는 long을 생
		// 천단위 구분 기호는 _
		long l = 200_000_000_000L;
		System.out.println("l:"+l);
		
		// 16진수 저장 - 참조 나 색상을 나타낼 때 많이 이용
		x = 0x78A;
		System.out.println("x:"+x);
		// 8진수 저장 - 권한 설정할 때 
		// rwx로 권한을 표현하는 경우가 많음
		x = 0777;
		System.out.println("x:"+x);
	}

}​
실행 결과


✔️실수 자료형
# float
: 4byte, 10의 38승 정도를 저장할 수 있고 정밀도는 소수 7자리 정도
# double
: 8byte, 10의 308승 정도를 저장할 수 있고 정밀고는 소수 15자리 정도, 실수 리터럴의 기준형
> float 형 리터럴을 만들 때는 뒤에 f를 붙여야 함
> double형 리터럴을 만들 떄는 뒤에 d를 붙여도 되고 붙이지 않아도 됨
> 실제 저장이 될 때는 부동소수점 형태로 저장이 되기 때문에 부호가수지수 형태로 작성이 가능함
3.14 => +0.314E001 형태로 작성해도 되며 대문자 E 대신 소문자 e 가능
package kakao.itoriginal.datatype;

public class PrimitiveType {

	public static void main(String[] args) {
		// 정밀도가 7번째 자리 까지 이므로 8번째 자리 아래에서 반올림
		float f = 0.1234567890123456789f;
		System.out.println("f:" +f);
	}

}​
실행 결과


💡지금의 컴퓨터는 CPU안에 수치 연산 보조 프로세서가 존재해서 연산을 double 단위로 수행 함

# 문자 저장

> 문자 리터럴은 '' 안에 하나의 문자를 기재하면 됨
> 자바는 유니코드를 사용하기 때문에 char가 2byte임
> 문자에 해당하는 정수 코드를 설정해도 됨
☑︎ 문자 0 = 48
☑︎ 문자 A = 65
☑︎ 문자 a = 97
> 문자는 모든 경우에 정수로 취급하고 출력할 때만 문자로 취급
> 대입할 땐 \ 다음에 8진수 3자리로 대입 가능하고 \u 다음에 16진수로 4자리 대입 가능함
> 'A' + 1 은 66 임
package kakao.itoriginal.datatype;

public class PrimitiveType {

	public static void main(String[] args) {
		char ch = 'A';
		System.out.println("ch:"+ch);
		System.out.println(ch+1);
        
        	ch = '\uAC00';
		System.out.println("ch:"+ch);
	}
}​
실행 결과

# 제어문자
> \ 다음에 하나의 문자를 추가해서 특별한 기능을 갖도록 한 문자
> \n, \t, \\, \', \'', \0

# Overflow 와 Underflow
> Overflow 는 표현 범위를 위쪽으로 넘어선 경우로 앞쪽의 데이터를 잘라버리기 때문에 넘어가면 가장 작은 숫자부터 다시 시작하게 됨
> Underflow 는 반대의 경우로 가장 큰 숫자부터 다시 시작함
package kakao.itoriginal.datatype;

public class PrimitiveType {

	public static void main(String[] args) {
		// int는 21억 정도까지 저장이 가능한데 연산의 결과가 21억이 넘어섬 -Overflow
		// 이 경우는 결과가 음수가 됨.
		int x = 2000000000 + 1000000000;
		System.out.println(x);
		
		// Underflow
		int y = 2000000000 + -1000000000;
		System.out.println(y);		
	}
}​
실행 결과
# boolean 데이터
> true 아니면 false 만 저장
> Java API 메서드 중에서 이름이 is로 시작하면 return 은 boolean
> boolean으로 변수를 생성할 때 도 앞에 is를 붙이는 것이 일반적
> 이 자료형은 문자열로 변환하거나 문자열을 이 자료형으로 변환하는 것 이외의 다른 자료형과의 호환은 안됨

7) String

> 0개 이상의 문자열을 저장할 때 사용할 수 있는 클래스
> 기본형은 아니지만 기본형 처럼 사용
> 인스턴스를 생성할 때 리터럴을 이용할 수 있음
> 문자열 리터럴은 " " 안에 기재

# String 이름 = "문자열"
> toString 메서드는 저장하고 있는 문자열을 리턴하도록 만들어져 있어서 바로 출력이 가능

8) 서식을 이용한 데이터 출력

  • System.out.printf 이용
# 첫번째 매개변수로 문자열 형태로 서식을 설정
서식을 설정할 때는 %와 포맷문자를 조합해서 데이터를 서식에 맞춰서 출력
두번째 매개변수 부터는 앞의 서식 문자와 매핑되는 데이터를 나열함

# 서식문자
%d : 10진수
%x : 16진수
%o : 8진수
%i : 10진수
%f : 실수
%e : 지수 형태로 출력
%c : 하나의 문자
%b : boolean
%s : 문자열

# 서식 문자 앞에 숫자를 추가해서 자릿수를 확보 가능
> %10d : 10자리를 확보해서 출력
> %010d : 10자리를 확보해서 출력하고 남는 자리는 0
> %전체자릿수.소수자릿수f : 전체 자리를 확보하고 소수 자릿수 만큼 소수를 출력 - 반올림
> 전체 자릿수를 생략하고 소수 자릿수 형태로 설정 가능
> 정수 부분은 실제 데이터의 길이보다 적은 자릿수를 설정해도 숫자는 잘리지 않고 전부 출력

Operator(연산자)

1. 연산의 분류

1) 연산의 결과 또는 연산될 때 데이터에 따른 분류

> Arithmetic Operation(산술 연산) : 숫자 데이터의 연산
> Logical Operation(논리 연산) : boolean 데이터의 연산

2) 피연산자의 개수에 따른 분류

> Unary : 데이터가 1개이면 수행되는 연산
> Binary : 데이터가 2개이면 수행되는 연산
> Ternary : 데이터가 3개이면 수행되는 연산

3) 용도에 따른 연산 및 우선 순위

# ( ), [ ], { }, . : 최우선 연산자
# ++, --, 부호 +, 부호 -, (자료형), !, ~ : 단항 연산자
# %, /, *, +, - : 이항 산술 연산자
# >>, <<, >>>, <<< : shift 연산자 - 이항 산술로 취급하기도 함
# <, <=, >, >=, instance of, ==, != : 논리 연산자로 >, >=, <, <= 는 숫자 데이터만 사용 가능하고 ==, 와 !=는 모든 자료형에 사용가능 하며 instance of 만 데이터가 인스턴스와 클래스
# &, ^, | : 정수 데이터를 가지고 2진수의 비트 단위로 연산을해서 정수 데이터로 리턴하는 연산자
# ?: : 삼항 연산자
# =, 연산자= : 할당 연산자
# ,

2. 최우선 연산자

1) (  )

> 연산의 우선순위를 변경하기 위해서 사용하는 연산자

2) [  ], {  } 연산자

> [ ]는 배열의 크기나 인덱스를 설정할 때 사용하고 {} 는 배열을 생성할 때 사용

3) ~ 연산자

> 1의 보수를 구해주는 연산자
> 정수 데이터의 모든 비트를 반전하는 연산자
> 양수에 붙이면 부호는 음수가 되고 절대값은 1 증가
> 음수에 붙이면 부호는 양수가 되고 절대값은 1 감소
> 숫자 연산으로는 큰 의미가 없고 비트 반전(색상 반전 등)에만 사용

4) ! 연산자

> boolean 데이터에만 사용가능한데 boolean 데이터 반전에 사용

5) 부호 +, -

> +는 대부분 생략하는 것이고 - 는 음수로 보는데 실제로는 2의 보수를 구해주는 연산자

6) 증감 연산자

> ++ 와 --
> 정수 변수 데이터만 사용
> 변수의 데이터를 1증가 시키거나 감소 시키는 연산자
> 데이터의 앞(prefix)과 뒤(postfix) 모두에 사용 가능
앞에 사용되면 변수의 값을 먼저 증감
뒤에 사용되면 변수의 값을 나중에 증감

4. 산술 연산자

☑︎ % : 정수 데이터를 가지고 나머지를 구해주는 연산자
☑︎ /, *, -, + : 숫자 데이터를 가지고 사칙 연산을 수행
☑︎ Java에서는 산술 연산의 최소 단위가 int
byte, short, char 는 int로 변환되서 산술 연산을 수행하고 결과를 int로 리턴
2개의 서로 다른 숫자 자료형 끼리 연산을 하면 더 큰 자료형으로 변환해서 연산을 수행하고 결과도 큰 자료형으로 리턴

byte < short, char < int < long < float < double

☑︎ 데이터 입력 도중 한 글자 오류가 나는 걸 transcription error 라고 함
transcription error를 방지하는 방법 중 하나는 데이터 몇 개를 추가해서 특정한 숫자로 나누었을 때 나머지가 0이 되도록 하는 방법을 사용
주민등록번호 나 신용카드 번호 또는 계좌번호 등이 이 원리를 이용
숫자 3자리로 구분을 하고자 하는 경우 숫자 1개를 추가해서 4자리로 구성하는데 3자리는 직접 입력하도록 하고 1자리는 연산을 해서 설정
mod 10을 사용

5. Type Casting(자료형 변환)

# 데이터의 자료형을 변경하는 것

# 자동 형 변환 : 묵시적으로 이루어지는 형 변환
> 산술 연산에 int 보다 작은 숫자 자료형을 사용한 경우 int 로 자동 형 변환
> 서로 다른 자료형끼리 산술 연산을 수행하는 경우 더 큰 자료형으로 자동 형 변환해서 연산을 수행

# 강제 형 변환 : 명시적으로 형 변환을 수행하는 것
> (자료형이름) 데이터 - 데이터의 자료형이 ( ) 안의 자료형으로 변환됨
> 숫자 데이터끼리 강제 형 변환이 가능하고 인스턴스끼리는 상속 관계인 경우만 가능
> 숫자 데이터와 문자 데이터끼리는 강제 형 변환은 안되지만 메서드가 제공됨
> 문자열을 숫자 데이터로 변환할 때는 Wrapper 클래스를 이용하면 되고 숫자 데이터를 문자 데이터로 변경할 때는 String의 메서드를 이용해도 되고 빈 문자열과 + 연산을 수행해도 됨
> 강제 형 변환을 하는 이유는 원하는 결과를 만들기 위해서 임
> 실수를 정수로 강제 형 변환할 때는 소수 부분이 사라짐
> 큰 자료형에서 작은 자료형 형 변환할 때는 데이터의 손실이 있을 수 있음

# 언어마다 숫자를 다루는 방식이 다르므로 숫자 연산을 수행하기 전에 그 언어의 숫자 데이터를 다루는 부분을 알아두어야 함

6. shift 연산자

> 정수 데이터에만 사용가능
> 2진수를 가지고 비트 단위로 밀어내는 연산자
<< : 첫번째 비트를 제외하고 나머지 비트를 왼쪽에서 제거하고 뒤에 0을 삽입하는 구조
>> : 뒤에서 밀어내는데 맨앞에 추가되는 비트는 첫번째 비트를 계속해서 추가
부호가 변경되지 않음
>>> : 맨 앞에 0을 추가하면서 밀어내는 연산자
음수를 가지고 수행하게 되면 양수가 만들어짐

> 32번 이상 밀어내도록 하면 32로 나눈 나머지 만큼 밀어냄
32번 이상 shift 하지 않음

> shift는 특정 비트가 1 인지 확인하고자 할 때 많이 사용함
컴퓨터 내부적으로 곱하기와 나누기를 할 때 사용

7. 크기 비교 연산자

1) >, >=, < , <=

> 숫자 데이터에만 사용할 수 있고 결과는 boolean

2) 동일성 여부

== : 해시코드를 비교해서 일치하면 true
!= : 해시코드를 비교해서 일치하면 false
> 저장하고 있는 데이터가 일치하는지 확인하고자 하는 경우는 equals 메서드를 재정의해서 사용

public class RelationOpratior {
    public static void main(String[] args) {
        //Literal을 이용해서 생성 - 데이터가 같으므로 동일한 해시코드를 갖음
        String s1 = "JAVA";
        String s2 = "JAVA";
        //해시코드가 같아서 true
        System.out.println(s1 == s2);
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));
        java.util.Scanner sc = new java.util.Scanner(System.in);
        System.out.println("문자열을 입력 : ");
        //문자열을 입력받아서 생성 - 리터럴을 만든 것이 아님
        String s3 = sc.nextLine();
        System.out.println(s3);
        //동일한 JAVA를 입력해도 해시코드가 다름
        System.out.println(System.identityHashCode(s3));
        //해시코드가 달라서 false
        System.out.println(s1 == s3);
        //인스턴스의 경우는 equals로 내용을 비교
        System.out.println(s1.equals(s3));
    }
}​

3) instance of

> 어떤 인스턴스가 클래스의 인스턴스인지 확인하는 연산자
> 클래스는 상위 클래스이면 됨
> 일반 프로그래밍에서는 잘 사용되지 않고 Generic이 적용되는 경우에 사용됨
대입되는 데이터가 특정 클래스 타입인지 확인하고자 할 때 사용

8. 논리 연산자

> && : boolean 데이터에만 적용이 가능한데 둘 다 true일 때 만 true가 나오는 연산사
> || : boolean 데이터에만 적용 가능하며 둘 다 false일 때 만 false가 나오는 연산자
> && 가 우선순위가 높음
> && 는 앞의 결과가 false 이면 뒤의 결과를 확인하지 않음
> || 는 앞의 결과가 true이면 뒤의 결과를 확인 하지 않음
> java는 boolean 데이터 이외는 boolean으로 간주 하지 않음