[자바] 1. 자바 기초

개발자 춘식이·2023년 7월 3일
0

Java

목록 보기
1/8
post-thumbnail

도서 자바의신, 이것이 자바다를 참고하였습니다.

1. 클래스(Class)

자바의 메소드는 어디에 속할까요? 바로 클래스입니다. 따라서 클래스는 자바의 가장 작은 단위이자 객체를 정의해놓은 설계도입니다. 그리고 이 클래스는 객체를 생성하기 위해 사용됩니다.
클래스는 상태(state)행동(behavior)가 포함되어 있습니다. 여기서 말하는 상태는 변수를, 행동은 메소드를 말합니다. 상태와 행동을 포함하기는 하지만 꼭 필요한 것은 아닙니다. 0개의 변수와 0개의 메서드가 있을 수 있으니까요.
클래스는 라이브러리(API)용과 실행용으로 나뉩니다. API용은 다른 클래스에서 이용할 목적으로 설계되고, 실행용은 프로그램의 실행 진입점인 main() 메소드를 제공하는 역할을 합니다. 보통 1개의 실행용 + n개의 라이브러리용으로 구성됩니다.


2. 컴파일(Compile)

자바는 프로그래밍 언어 중에서 고급 언어에 속합니다. 개발자가 소스를 작성하면 컴파일러(javac.exe)를 통해 기계어로 변환된 후 컴퓨터에서 실행할 수 있습니다. 이렇게, 개발자가 작성한 소스를 컴퓨터가 이해할 수 있도록 엮어주는 작업을 컴파일이라고 합니다.
https://medium.com/@PrayagBhakar/lesson-2-behind-the-scenes-4df6a461f31f
출처(https://medium.com/@PrayagBhakar/lesson-2-behind-the-scenes-4df6a461f31f)

.java 라는 확장자로 되어있는 소스를 컴파일하면 .class라는 확장자를 갖는 파일이 생성되어 디스크에 저장되는데, 이 .class 파일은 컴퓨터가 보다 더 빨리 읽을 수 있도록 0과 1 이진수로 되어있는 binary 파일입니다.


3. public static void main(String[] args) {...}

java 명령어로 실행하는 자바 프로그램의 진입점은 main() 메소드로, 실행을 목적으로 하는 모든 자바 클래스는 반드시 메인 메소드가 있어야 합니다. 따라서 main() 메소드가 없는 클래스를 실행하려고 하면 NoSuchMethodError가 발생하게 됩니다. 참고로, args 변수명은 변해도 됩니다.


4. 객체(Object)

객체 또는 인스턴스(Instance)라고도 불립니다. 클래스를 통해 실제 사물을 나타내기 위한 것으로 new 예약어를 통해 생성자를 호출하면 객체가 생성됩니다.
객체는 실제로 존재하는 것으로 사물 또는 개념을 의미하며, 객체의 용도는 객체가 가지고 있는 기능과 속성에 따라 다릅니다. 객체는 모든 인스턴스를 대표하는 일반적 언어이며, 인스턴스는 특정 클래스로부터 생성된 객체입니다.
즉, 클래스 --인스턴스화--> 인스턴스 (객체) 입니다.

1) new 연산자

new 연산자는 객체를 생성시키는 연산자로, 메모리 힙(heap) 영역에 객체 생성 후, 객체의 주소를 리턴합니다. 이 주소를 참조 타입인 클래스 변수에 저장해두면, 변수를 통해 객체 사용이 가능합니다.


5. 생성자(Constructor)

객체를 생성하기 위한 거의 유일한 도구로, 개발자가 명시적으로 작성하지 않는다면 클래스를 컴파일할 때 기본 생성자(매개 변수가 없는 생성자)가 클래스 파일 안에 자동으로 생성됩니다.


6. 변수(Variable)

변수는 하나의 값을 저장할 수 있는 메모리 공간으로 4개의 종류로 나뉠 수 있습니다.

public class A {
	int 인스턴스변수;
    static int 클래스변수;
    
    public void method(int 매개변수) {
    	int 지역변수;
    }
}
  • 지역 변수(local variable): {중괄호} 내에서 선언된 변수로, 선언한 중괄호 내에서만 유효합니다.
  • 매개 변수(parameters): 메소드에 넘겨주는 변수로, 메소드 호출 시 생성되고 끝나면 소멸됩니다.
  • 인스턴스 변수(instance variable): 메소드 밖에, 클래스 안에 선언된 변수로 객체가 생성될 때 생명이 시작되며 참조하고 있는 다른 객체가 없으면 소멸됩니다.
  • 클래스 변수(class variable): 인스턴스 변수와 같은 범위이지만, 앞에 static 예약어가 있는 변수입니다. 클래스가 처음 호출될 때 생명이 시작되고 자바 프로그램이 끝날 때 소멸됩니다.
if (true) {
	int localVariable;     //1
    if (true) {
    	int localVariable; //2
    }
}

과연 1과 2는 같은 변수일까요? 아닙니다. 1번째 localVariable은 생명이 가장 아래 중괄호에서 끝나므로 같은 변수가 아닐 뿐더러, localVariable is already defined in... 컴파일 에러가 발생합니다. 이렇게 사용하면 절대! 안됩니다.

자바의 변수 명명규칙은 아래와 같습니다.

  • 길이 제한은 없습니다.
  • 첫 문자는 유니코드 문자, 알파벳, $, _ 만 올 수 있습니다.
  • 두 번째 문자부터는 모두 사용 가능합니다.
  • 영어 대소문자가 구분됩니다.
  • 관례로 카멜케이스를 사용합니다.
  • 상수는 모두 대문자, _ 로 구분합니다.
  • 자바 예약어는 사용할 수 없습니다.

7. 기본 자료형(Primitive data type)

자바의 기본 자료형은 new 예약어 없이 바로 초기화가 가능합니다. 정수형, 소수형, 기타로 나뉘며 총 8개입니다.

  • 정수형: byte, short, int, long, char
  • 소수형: float, double
  • 기타: boolean
타입 최소 최대
byte -128(-2^7) 127(2^7-1)
short -32,768(-2^15) 32,767(2^15-1)
int -2,147,483,648(-2^31) 2,147,483,647(2^31-1)
long -9,223,372,036,854,775,808(-2^63) 9,223,372,036,854,775,807(2^63-1)
char 0('\u0000')(0) 65,535('\ufff')(2^16-1)

unsgined(부호가 없는)인 것은 오직 char뿐입니다.
지역 변수로 기본 자료형 사용 시에는 반드시 값을 지정해 초기화를 해주어야 합니다. 그렇지 않으면 컴파일 에러가 발생합니다. 디폴트값은 아래와 같습니다.

  • byte: 0
  • short: 0
  • int: 0
  • long: 0
  • float: 0.0
  • double: 0.0
  • char: 공백(\u0000)
  • boolean: false

1) byte

byte8bit(0과 1로 표현할 수 있는 공간이 8개)의 부호가 있는 타입입니다. 색상 정보 및 파일 또는 이미지 등의 바이너리 데이터를 저장하거나 처리할 때 byte 값들을 조합해서 사용합니다. 이는 적은 공간에 보다 많은 내용을 저장할 수 있기 때문입니다. int나 long을 사용하면 적은 데이터를 저장하려고 해도 32bit(int의 경우)의 공간이 필요하게 됩니다. 이와 같이 낭비를 줄이기 위해 byte형을 사용합니다.

2) 실수(float/double)

float은 32bit(4byte), double은 64bit(8byte)를 나타내고, 이 크기를 넘어서면 값의 정확성을 보장해주지 않습니다.
-> 이 때는 java.math.BigDecimal 클래스를 사용해야 합니다.
실수 리터럴의 기본 타입은 double이며 float의 경우 끝에 F 또는 f를 붙여주어야 합니다. 정수 리터럴에 10의 지수를 나타내는 E 또는 e가 포함되어 있을 경우 실수 타입에 저장해야 합니다.
http://www.tcpschool.com/lectures/img_c_floating_point_32.png

출처: http://www.tcpschool.com/lectures/img_c_floating_point_32.png

  • float: 부호(1bit) + 지수(8bit) + 가수(23bit) = 32bit
  • double: 부호(1bit) + 지수(11bit) + 가수(52bit) = 64bit

3) 캐릭터(char)

자바는 모든 문자를 유니코드로 처리합니다. char는 2byte의 unsigned 정수값을 저장하는데, 0~65,535까지 저장합니다. 음수로 저장할 경우 possible loss of precision... 컴파일 에러가 발생합니다.
세계 각국의 문자들을 2byte(0~65,535)로 표현되는 코드값으로 매핑한 국제 표준 규약이 있는데, 0부터 127까지는 ASCII(특수기호, 숫자, 영어 알파벳)을 사용하고 한글 문자같은 경우 44,032부터 55,203이 해당됩니다.
char는 홑따옴표 안에 \u로 시작을 해야하고 \u 뒤에는 반드시 4개의 16진수 값이 와야 합니다. 또는 \u 없이 사용한다면 하나의 문자만 사용 가능합니다.

char c= ''; //컴파일 에러
char c= ' '; //공백(유니코드:32) 가능

8. 조건문

1) if문

if (boolean) {
	//처리문장;
} else if (boolean) {
	//처리문장;
} else {
	//처리문장;
}

boolean값은 반드시 true인 경우만 처리합니다. 보통 2가지 이상의 값을 비교하거나 단순히 true, false 여부만 확인하고자 할 때 많이 사용됩니다.

2) swtich문

switch (비교대상변수) {
	case1 점검값:
    	처리문장1;
        break;
    case2 점검값:
    	처리문장2;
        break;
    default:
    	기본처리문장;
        break;
}

Java6까지는 비교대상변수에 long을 제외한 정수, Enum, 몇몇 참조형(Character, Byte, Short, Integer)만 가능했지만, Java7부터는 String도 가능합니다.

3) while문

while (flag) {
	if (...) continue; //다시 while문으로 돌아감
    if (...) break;    //while문을 빠져나옴
}

또는 반드시 처리해야 할 문장이 있다면 아래와 같이 사용합니다.

do {
	처리문장;
} while (boolean조건);

이 때는 while안에 있는 조건식이 false가 될 때까지 실행을 반복합니다.

4) for문

for (초기화식; 조건식; 증감식) {
	반복실행문장;
}

for문은 반복 횟수를 알고 있을 때 주로 사용합니다. 초기화식에서는 부동소수점 타입을 사용하지 말아야 합니다.

for (타입 변수 : 배열) {
	실행문;
}

처럼 향상된 for문을 사용하여 간결하게 코드를 작성할 수도 있습니다.

5) label 예약어

public void methodA() {
	startLabel:
    	for (...) {
        	for (...) {
            	if (...) {
                	continue startLabel; //바깥쪽 루프의 시작점으로 바로 이동
                }
            }
        }
}

label을 사용하게 되면 label을 선언한 곳으로 바로 이동하게 됩니다.

6) break문

break문은 for문, while문, do-while문, switch문을 종료할 때 사용됩니다. 대개 if문과 같이 사용되며, 반복문이 중첩되어 있을 경우 break문은 가장 가까운 반복문만 종료합니다.
바깥쪽 반복문까지 종료시키려면 반복문에 라벨을 붙이고 break 라벨;을 사용해야 합니다.

Label: for (...) {
		for(...) {
        	break Label;
        }
}

7) continue문

continue는 for문, while문, do-while문에서 사용됩니다. for문은 증감식으로 이동을 하고 while문과 do-while문은 조건식으로 이동하게 됩니다.


지속적으로 수정할 예정입니다. 잘못된 부분 있으면 알려주세요😃
2023-07-04 v1.0

profile
춘식이를 너무 좋아하는 주니어 백엔드 개발자입니다.

0개의 댓글