JAVA/공부

JAVA 기초

GaeGim 2022. 6. 22. 23:48
반응형
  • memo

객체 지향 언어 (Objected Oriented Programming)

객체는 실체하는 모든 것을 이르는 말이고, 객체들의 동작들을 이용해 프로그래밍하는 언어.

 

 

· OOP의 4가지 특징

캡슐화 : 데이터 구조, 역할, 기능을 묶어서 객체의 자율성을 높이고 결합도는 낮게 유지하도록 해주는 것

상속 : 클래스의 특성과 기능을 물려받아 클래스 재사용이 용이하도록 해주는 것

추상화 : 필요한 공통 내용만 묶어 표현하는 것

다형화 : 동일 대상에 대해 상황에 따라 다른 결과를 내는 것

 

 

자바에서 단일 상속인 경우 : 객체 사용.

               다중 상속인 경우 : 인터페이스 사용.

 

동적 바인딩(Dynamic Binding)이 가능하다.

바인딩 : 프로그램 구성 요소 정의하는 것. 정의 후 변경 불가.

 

패키지 : 여러 클래스를 묶는 물리 단위.

패키지 표시 없다 : 디폴트 패키지(Anonymous Package)

 

임포트 : 다른 패키지의 클래스 사용할 때 사용할 클래스으 패키지를 임포트문으로 미리 명시하면

소스코드에 사용되는 클래스 이름에서 패키지명 생략 가능

임포트 사용 : import 경로.*;

 

제어자

접근제어자 : public, private, protected, default

static : 컴파일 시 객체 생성 유무 관계없이 메모리 한 번 할당

            static으로 변수 값 설정 시 변경되지 않는 메모리 가리켜 그 변수 값 공유 가능함.

static과 abstract 함께 사용 불가.

final 키워드 : 클래스, 속성, 지역변수, 메소드 변형 불가

 

· buffer : 임시 저장 메모리

 

 


 

  • 자료형

상수 : 변하지 않는 값

변수 : 상수를 저장할 수 있는 메모리 공간

 

- 변수, 상수, 메서드 공통 명명 규칙 : 어떤 역할, 목적으로 쓰이는 지에 대해 명확해야 한다.

· 필수사항 (지키지 않을 시 문법오류 발생)

1. 영문 대소 문자와 한글 사용 가능하다.

2. 특수 문자는 밑줄(_)과 달러($) 표기만 사용 가능하다.

3. 아라비아 숫자(1, 2, 3, ..)를 사용 가능하지만, 첫 글자엔 사용이 불가하다.

4. 자바에서 사용 중인 예약어( int, continue, ..) 사용이 불가하다.

· 권장사항(현업에서 주로 쓰이는 방법)

변수, 메서드) 영문 소문자로 시작하고 영문 단어가 2개 이상 들어갈 시 뒷 단어는 영문 대문자로 시작한다. -> 낙타 표기법

상수) 변수와 구별하기 위해 모두 대문자로 표기하고 추가되는 단어가 있을 시 밑줄(_)을 추가해 구분해 준다.

 

· 변수의 생성과 소멸

변수는 선언된 시점에 생성된다. 대입할 때 생성되는 것이 아니다.

자신이 선언된 열린 중괄호({)와 그의 쌍인 닫힌 중괄호(})를 만나면 JVM에 의해 메모리에서 삭제된다.

 

 

 

지료형은 데이터를 저장하지 위해 생성한 메모리 공간을 목적에 맞는 크기와 특징으로 나눌 수 있게 해주는 것이다.

자료형 사용 전 반드시 선언해야 하고 한 번 선언해야 하며 한 번 선언됐을 시 자료형 변경이 불가하다.

 

· 기본 자료형

논리형 : boolean(1byte)

문자형 : char(2byte)

정수형 : byte(1byte), short(2byte), int(4byte), long(8byte)

실수형 : float(4byte), double(8byte)

※float 정밀도 : 소수점 7자리, double 정밀도 : 소수점 15자리

양수 범위 넘어가면 overflow, 음수 범위 넘어가면 underflow

· 참조 자료형 : 배열, 클래스, 인터페이스

참조 자료형은 객체를 저장하며 메모리 크기를 사용자가 지정할 수 있다.

 

· 메모리 크기순

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

 

· 자료명 명명 규칙

기본 자료형은 영문 소문자 사용

참조 자료형은 첫 글자를 영문 대문자로 시작 (권장사항)

 

· 기본 자료형과 참조 자료형은 값의 저장 방식이 달라 서로 구분된다.

· 실제 데이터 저장 위치 

기본 자료형 : 스택 메모리에 생성된 공간에 실제 데이터 값 저장

참조 자료형 : 실제 데이터 값은 힙 메모리에 저장하고, 스택 메모리 변수 공간엔 실제 변수값이 저장된 힙 메모리의 위치값 저장

※ 자바는 힙 메모리에 직접 접근 불가하기 때문에 위치값을 포함한 참조 변수가 필요하다.

 

※ 항상 대입 연산자(=)를 기준으로 왼쪽, 오른쪽의 자료형이 동일해야 한다.

리터럴 : 코드에 직접 작성한 값

정수 리터럴의 경우

i) byte, short 자료형에 저장할 수 있는 범위 내 정수값 입력 시 각각의 자료형에 입력됨.

ii) byte, short 자료형에 저장할 수 없는 범위의 정수 리터럴은 모두 int형으로 인식된다.

    ex) byte b = 500; -> (byte = int) 양쪽 타입 안 맞아 오류 발생

iii) 크기 상관없이  int, long형에 정수 리터럴 입력시 int형으로 인식한다.  

    하지만 정수 리터럴 뒤에 L이나 l 붙으면 long으로 인식하고, L, l 추가하지 않아도 자동 타입 변환되어 long형으로 변환된다.

실수 리터럴의 경우

자바는 실수 리터럴을 double 자료형으로 인식한다.

float 자료형으로 인식하게 하고 싶으면 F나 f를 실수 리터럴 뒤에 붙이면 된다.

 

서로 다른 타입과 연산 불가 -> 타입 변환 필요

iii처럼 크기가 작은 자료형(int)을 큰 자료형(long)으로 대입하면 컴팡릴러가 자동 타입 변환을 수행해주기 때문에 오류가 발생하지 않는다. 하지만 ii처럼 큰 자료형(int)에서 작은 자료형(byte)으로의 타입 변환은 자동으로 일어나지 않아 문법 오류가 발생한다. 

 

문자 자료형

메모리는 문자를 기록할 수 없다. -> 문자를 특정 정수값으로 바꿔 저장하는 방법 이용.

· 유니코드 표 : 모든 문자를 특정 정숫값으로 바꿔 놓은 표

문자 저장 시 유니코드 표를 보고 그 문자에 해당하는 정수로 바꿔 메모리에 저장하고,

문자 읽을 시엔 정수를 읽어 와서 그 정수에 해당하는 문자를 출력한다.

- 유니코드 직접 입력 : \u + 16진수 유니코드

(유니코드 값은 2byte이므로, 16진수 4자리로 표현)

10진수, 16진수로 입력할 수 있지만 최종 메모리엔 2진수로 저장된다.

 

 

· 기본 자료형 간 타입 변환

boolean 자료형을 제외한 기보 자료형 타입은 서로 자료형을 변환할 수 있다. -> 타입 변환

- 변환 방법

변환 대상 앞에 (자료형)을 표기해주고, 정수나 리터럴은 L, l, F, f를 붙여 필요 시 long, float 타입으로 변환시켜준다.

※ 자료형마다 값 저장 범위나 종류가 달라 변환되는 값이 변할 수 있다.

 

· 자동 타입 변환

작은 자료형 -> 큰 자료형 (업 캐스팅) : 어떠한 데이터 손실도 없다.

· 수동 타입 변환

큰 자료형 -> 작은 자료형 (다운 캐스팅) : 데이터 손실 발생 가능. 컴파일러에 따른 자동 타입 변환 발생하지 않음.

명시적인 타입 변환 수행 필요.

※ double -> float 타입 변환 시 별 문제 없어보일 수 있지만 소수점 8이상인 double일 시 오차가 발생한다.

 

· 기본 자료형 간 연산

자료형 같을 때)

연산 결과
byte + byte int
short + short itn
int + int int
long + long long
float + float float
double + double double

 

자료형이 다를 때)

연산 결과
byte + short int
byte + int int
short + long long
int + float float
long + float float
float + double doublie

 

 

 

 

 

 


 

 

  • 연산자

결과에 따라 3가지로 분류할 수 있다.

결과 자료형 연산 기호 기능
산술 연산자 +, -, *, /, % 사칙연산과 나머지 연산
증감 연산자 ++, -- 값이 1씩 증가, 감소
비트 연산자 &, |, ~, ^ 비트 AND, OR, NOT, XOR
시프트 연산자 <<, >>, >>> 비트 단위 이동
참 또는 거짓 비교 연산자 <, >, <=, >=, ==, != 값의 크기 비교
논리 연산자 &&, ||, !, ^ 논리 AND, OR, NOT, XOR
실행 대입 연산자 =, +=, -=, *=, /=, &=, |=, >>=, <<=, >>>= 산술 연산 결과의 대입
삼항 연산자 ? x:y 참일 때 x, 거짓일 때 y

 

· 산술 연산자

/연산 시 기본 자료형 간 연산에서 int/int=int이므로 데이터 손실 가능성이 있다.

%연산은 나누기를 수행한 이후의 나머지를 나타낸다. 모듈로(modulo) 연산이라고도 한다.

 

 

· 증감 연산자

a++은 a=a+1, 즉 a에 1을 더하고 다시 a에 대입하라는 의미다.

증감 연산자는 전위형과 후위형으로 다시 나뉠 수 있다.

전위형은 변수 앞에 붙으며(++a) 다른 모든 명령보다 먼저 실행되고

후위형은 변수 뒤에 붙으며(a++) 다른 모든 명령보다 나중에 실행된다.

ex)

int num1 = 3;
int num2 = 4;
int num3 = 2 + num1-- + ++num2;
SYstem.out.println(num1);	//2
SYstem.out.println(num2);	//5
SYstem.out.println(num3);	//2+3+5 ∴10 (num1 증감 연산자 반영 전이기 때문에)

 

 

· 비트 연산자

비트 단위 연산자. 

& : 두 값이 모두 1일 때만 1인 연산자

| : 두 값이 모두 0일 때만 0인 연산자^ : 두 값이 같을 때 0, 다를 때 1인 연산자~ : 0은 1, 1은 0으로 반전하는 연산자

 

 

※ NOT 연산자

값의 첫번째 비트는 부호비트로, 0이면 양수, 1이면 음수다. 값의 부호를 결정한다.

양수는 1을 기준으로 값을 읽고,

음수는 0을 기준으로 값을 읽은 후에 1을 더한 값이 음수의 절댓값이므로 절댓값에 음수 부호를 붙인다.

ex) 001010 -> 10

       111010 -> -(5+1) = -6

System.out.println(~3)		// 출력 : -4
System.out.println(~0b00000000)		//0(10) 출력 : -1

 

 

· 시프트 연산자

비트의 위치를 좌우로 이동하는 연산으로, 산술 시프트(<<, >>)와 논리시프트(>>>)로 나뉜다.

 

- 산술 시프트 : 숫자의 부호 비트는 유지하되 나머지 비트를 왼쪽, 오른쪽으로 이동하는 연산자.

<< 연산 시 1bit 이동 시마다 X2의 효과가 있으며 빈칸은 0으로 채운다.

>> 연산 시 1bit 이동 시마다 /2의 효과가 있으며 빈칸은 부호 비트 값으로 채운다.

>> 연산에서는 삭제되는 최하위 비트 값때문에 값을 2로 나눈 결과와 다르게 나올 수 있다.

연산자 부호 특성 예시
<< 양수, 음수 1bit 이동당 X2,
부호유지
3<<1=6,
-3<<1=-6
>> 양수 1bit 이동당 /2,
부호유지,
소수 버림
5>>2=1
(5>>1=2.5)
(2.5>>1=1.25. 0.25버림)
음수 1bit 이동당 /2,
부호유지,
소수 올림
-5>>2=-2
(-5>>1=-2.5)
(-2.5>>1=-1.25. 소수 올림)

프로그래밍 시, a<<1은 연산하는 과정일 뿐이라 변수 값에 변화가 없다. a<<=1이라고 해야 변수 값이 바뀐다

 

 

· 논리 시프트(>>>)

부호 비트를 포함해 전체 바트를 오른쪽으로 이동시키는 연산.

이동 시 발생하는 빈칸은 부호비트 상관없이 모두 0으로 채운다.

시프트 거리는 0~31의 범위.

만약 부호비트가 1인 음수일 때 논리 시프트하면 값이 양수로 변할 것이다.

System.out.println(3>>>1); 	//1
System.out.println(-3>>>31)	//1

 

· 비교 연산자

크기 비교와 등가 비교로 나뉜다.

연산 결과가 true, false중 하나로 나온다.

등가 비교 시 비교 대상이 무엇인지 알아야 한다. 비교 대상은 스택 메모리의 값이다.스택 메모리 값은 기본 자료형과 참조 자료형일 때 다르기 때문이다.-> 기본 자료형의 등가 비교 대상은 실제 데이터 값이고 참조 자료형의 등가 비교 대상은 실제 데이터 값이 있는 위치값.

 

※ 등가 비교(==)는 두 값이 동일한 지에 대한 여부 확인 후 T/F 반환하는 연산자

    대입 연산자(=)는 오른쪽의 값을 왼쪽에 대입하는 연산자

 

 

· 논리 연산자

피연산자, 연산자 모두 불리언 타입만 올 수 있다.

&& :  두 값이 모두 true일 때만 true

|| : 두 값이 모두 false일때만 false

^ : 두 값이 다를 때 true, 같을 때 false

! : true, false 값 반전

 

※ 비트 XOR, 논리 XOR의 기호 모두 ^를 사용. 좌우에 위치한 피연산자의 자료형으로 구분.

-정수^정수 : 비트 연산자, 불리언^불리언 : 논리 연산자

 

쇼트 서킷

연산 수행 과정에서 결과가 이미 확정됐을 때 연산 과정을 생략하는 것이다.

논리 연산은 비트 연산자로 수행할 수 있다. 논리 연산자로 논리 연산 수행하는 것과 비트 연산자로 논리 연산 수행하는 것의 차이는 쇼트 서킷의 적용 여부다.

 

쇼트 서킷은 불필요한(굳이 안 해도 되는) 계산 과정( ex) || 연산 시 앞 항에서 true 결과가 나왔을 때 등)을  생략하는 것이므로 결과에 영향을 미치지 않는다. 하지만 증감 연산자가 포함되어 있을 논리 연산의 경우 등 쇼트 서킷을 의도적으로 사용하지 않도록 해야 한다. 비트 연산자를 이용해 동일한 논리 연산 수행 시 연산 결과의 결정 시기에 관계없이 각 변수의 증감 연산이 수행된다.

 

논리 연산자로 논리 연산 시 쇼트 서킷 적용되지만 비트 연산자로 논리 연산 수행 시엔 쇼트 서킷이 적용되지 않는다. 즉, 비트 연산자로 논리 연산 수행 시 계산 괴정에서 결과가 확정돼도 나머지 연산을 모두 수행한다.

 

논리XOR 연산 수행 시 항상 양쪽 값을 확인해야 해 쇼트 서킷을 구조적으로 적용할 수 없다.

그래서 논리, 비트 ^ 연산이 동일하다.

 

int num=3;
System.out.println(false && ++num>6);	//뒤 항 연산X

int num1=3;
System.out.println(false & ++num>6);	//뒤 항 연산O

 

 

· 대입 연산자

a = a + 3;이란 식은 수학에서 성립되지 않는다.

하지만 자바 코드에선 가능하다. 

오른쪽이 먼저 계산되고 이후 대입 연산자가 실행되기 때문이다.(Right to Left Rules)

 

· 복합 할당 연산자

a=a+1;과 a++,  a+=1;는 같다

a=a<<2;와 a<<=2;는 같다

 

 

· 삼항 연산자

자바 연산자 중 유일하게 3개의 피연산자를 갖는 연산자

구성 : (참 또는 거짓) ? 참일 때 결과 : 거짓일 때 결과

물음표 앞에 불리언 타입만 올 수 있으며 주로 연산 결과가 불리언 자료형인 논리 연산자와 비교 연산자가 위치한다.

 

int num = (5>3) ? 10 : 20;
System.out.println(num);	//10

int num;
if(5>3) {
	num=10;
} else 
	num=20;
System.out.println(num);	//10

 

 

 

반응형

'JAVA > 공부' 카테고리의 다른 글

클래스 내부 구성 요소  (0) 2022.07.02
클래스와 객체  (0) 2022.07.02
배열 성적 처리 프로그램  (0) 2022.06.26
제어문  (0) 2022.06.24
스택과 힙 영역  (0) 2022.06.23