본문 바로가기
Study/JAVA

[2022-11-25] Java의 정석

by 까다로운오리 2022. 11. 25.

저번 면접을 보고.. 백엔드 개발자를 희망하는데 할 수 있는게 뭐냐는 질문을 받았기에

다음 날 바로 자바의 정석을 구매했다.

그동안 다른 곳 면접 준비하느라~ 공부를 못했는데~(핑계)

그 회사.. 남은 면접 약 2주.. 그 안에 자바의 정석 1회독 + 토이 프로젝트 1개 하는 것이 목표다.

해서 자바의 정석 그날 공부의 요약본을 올리고자 한다.

아는 것 들은 skip 하고 python과 다른 java의 부분 위주로 올릴 거다!

 


 

Java언어 특징

 

1. 운영체제에 독립적이다.

: 자바는 운영체제나 하드웨어가 아닌 JVM과 통신한다. JVM이 자바로 부터 전달 받은 명령을 운영체제가 이해할 수 있게 변환하여 전달해준다. (다만 JVM은 운영체제에 종속적이기 때문에 운영체제에 맞는 JVM을 설치 해야 한다.)

 

2. 객체 지향 언어이다

: 상속, 캡슐화, 다형성이 잘 적용되어 있다.

 

3. 비교적 배우기 쉽다.(라고 써져있지만 Python으로 프로그래밍을 시작한 나는.. 매우 어렵다)

 

4. 자동 메모리 관리(Garbage Collection)

:가비지 컬렉터가 자동적으로 메모리를 관리 해준다. 만약 이 기능이 없었다면, 프로그래머가 수동적으로 사용하지 않는 메모리를 체크,반환 해야 된다.

 

5. 네트워크와 분산 처리를 지원한다.

 

6. 멀티 쓰레드를 지원한다.

:시스템과 상관 없이 구현 가능하며, 관련된 라이브러리 (JAVA API)를 제공하여 구현이 쉽다.

 

7.동적 로딩을 지원한다.

: 자바로 작성된 애플리케이션은 여러개의 클래스로 구성되어 있다. 동적 로딩은, 필요시에 클래스를 로딩하여 사용할 수 있다는 장점이 있다. 또한, 일부가 변경 됐을 때 그 일부만 컴파일 하면 된다. 

 

 

 

JVM?

: 자바를 실행하기 위한 가상 기계

: 자바를 실행하기 위해선 반드시 필요함

 

 


Hello.java

 

자바를 실행하려면 다음과 같은 단계를 거친다.

javac.exe 를 사용해서 소스 파일(파일명.java) 로 부터 클래스 파일 (파일명.class)을 생성해야 한다. 그 다음에 자바 인터프리터(java.exe)로 실행한다.

 

 

class 클래스 이름 {

	public static void main(String[] args) // main메서드의 선언부
    {
    	//실행될 문장들을 적는다.
    }
}

1. 자바에서 모든 코드는 반드시 클래스 안에 존재해야 하며, 서로 관련된 코드들을 그룹으로 나누어 별도의 클래스를 구성하게 된다.

2. main 메서드 선언부 다음에 나오는 괄호는 메서드의 시작과 끝을 의미, 이 괄호 안에 작업할 내용을 적으면 된다.

3. main의 처음부터 끝까지 실행되면 종료된다.

4. 하나의 어플리케이션 안에 main 하나는 있어야 한다.

 

#Hello.java

public class Hello {}
	class Hello1 {}
       

#Hello2.java

class Hello2 {}
class Hello3 {}

 

5. 하나의 소스 파일에 둘 이상의 클래스를 정의하는 것도 가능하지만, '소스파일 이름은 public class'와 같아야 한다. 만약 소스 파일 내에 public class 가 없다면, 소스파일의 이름은 소스 파일 내의 어떤 클래스의 이름으로 해도 상관 없다.

 

 


콘솔에서 자바 애플리케이션을 실행시켰을 시

 

1. 프로그램 실행에 필요한 클래스(*.class)를 로드한다.

2. 클래스 파일을 검사한다. (파일 형식, 악성코드 체크)

3. 지정된 클래스에서 main(String[] args)를 호출한다.

 

자바 프로그래머들에게 권장하는 규칙

1. 클래스 이름의 첫 글자는 항상 대문자

2. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로

3. 상수의 이름은 모두 대문자. 여러 단어로 이루어진 경우 '_'로 구분

 


변수

자바는 정적 언어기 때문에 꼭 변수 type을 설정 해야 한다.

 

기본형

: boolean, 문자형 (char), 정수형( byte, short, int, long) , 실수형 (float, double)

참조형

: 객체의 주소를 저장, 8개의 기본형을 뺀 나머지

 

상수와 리터럴

상수형

: 변수와 마찬가지로 '값을 저장할 수 있는 공간'이짐나 변수와 달리 한번 값을 저장하면 변경 불가.

: 선언 방법  ->  final을 앞에다가 붙여준다.

 

literal

:그 자체로 값을 의미하는 것

ex1) int year = 2022;

ex2) final int YEAR = 2022;

 

문자 리터럴은 한글자면 '' (작은 따옴표)  ex) 'a'

둘 이상은 ""(큰 따옴표)를 써야 한다. ex) "ab"

 

문자열 덧셈도 가능한데

문자열 + any type -> 문자열 + 문자열

any type + 문자열 -> 문자열 + 문자열

 

class StringEx{


	public static void main(String[] args) {
    
    
    System.out.println(7 + 7 + "");
    }
}

# 77이 아니라 "14"가 나온다. 앞에 7+7을 먼저 계산하고 이후 14 + ""을 계산하여 문자열로 바뀜

 

입력

import java.util.*;

Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
int num = Integer.parseInt(input);

 

1. 입력 받고

2. 입력 받은 내용을 input에 저장

3. int로 바꿔줌

 

 

출력

 

1. 변수 타입을 변환하고 싶을 때 : System.out.printf("%d", age);

2. 변수 타입을 변환 안해도 될 때 : System.out.println(age);

 


문법

 

switch

int level = 2

switch (level) {
	case 4:
	case 3:
    	grantDelete();
   	case 2:
    	grantWrite();
        case 1:
    	grantRead();
        }

case 2 문을 찾아서 수행하고 break문이 없기 때문에 case1 까지 수행하고 구문을 빠져나온다.

만약 level=4면  grantDelete() 부터 수행

 

제약조건

1. switch문의 조건식 결과는 정수 또는 문자열이어야 한다.

2. case문의 값은 정수 상수만 가능하며, 중복 되지 않아야 한다.

 

 

do-while

do {


} while (조건식);

최소 한번 이상 수행하며, 조건식이 거짓일 시 다음 루프를 수행하지 않는다.

 

 

 

이름붙은반복문

colass FlowEx33
{
	public static void main (String[] args)
    {
    
    	Loop1 : for(int i=2; i <= 9; i++) {
        	for (int j=1; j <= 9; j++) {
            	if (j == 5)
                	break Loop1;
                    	break;
    
    }
}

해당 루프 뿐만 아니라 이름 붙은 루프 전체를 나갈 수 있음

 

 

 


배열

"같은 타입의 여러 변수를 하나의 묶음으로 다루는 것"

 

선언방법

#타입[] 변수이름;

int[] score;
String[] name;


#타입 변수이름[];

int score[];
String name[];

 

배열 생성 방법

int[] score; // int 타입의 배열을 다루기 위한 참조변수 score선언
score = new int[15]; // int타입의 값 5개를 저장할 수 있는 배열

 

인덱스

0 + 양의 정수 (~ 2^31-1)

python 처럼 음의 정수 불가

 

 

배열 초기화

int[] score = new int[] {값1, 값2};

이런 방법도 있음.. 이 외에는 python하고 동일

 

 

배열 복사

 

 

1. for문 이용

int[] arr = new int[5];

int[] tmp = new int[arr.length*2]; // 기존보다 길이가 2배인 배열 생성

for(int i = 0; i < arr.length; i++)
	tmp[i] = arr[i];

arr = tmp; // 참조변수 arr이 새로운 배열을 가리키게 한다.

 

2.System.arraycopy() 

배열의 복사는 for문 보다 System.arraycopy()를 사용하는 것이 더 효율 적이다.

System.arraycopy(num, 0, newNum, 0, num.length);

// num[0]에서 newNum[0]으로 mum.length개의 데이터를 복사

 


String 배열

String[] name = new String[3];

 

char배열과 String 클래스

String클래스는 char배열에 기능을 추가한 것 이다.

 

C언어에서는 문자열을 char로 묶어서 처리하지만, 객체지향언어인 자바에서는 char배열과 그에 관련된 기능들을 함꼐 묶어서 클래스에 정의한다.

다만 String객체는 읽을 수만 있을 뿐 내용을 변경할 수 없다.

ex) String a = "abcd" 하고 a[1] = 'c' 해서 accd 하는게 불가능

라고 자바 고인물 지인께서.. 그러셨습니다.

 

 

char배열과 String 클래스의 변환

char[] chArr = {'A', 'B', 'C'}
String str = new String(chArr); // char배열 -> String
char[] tmp = str.toCharArray(); // String -> char배열

 


다차원 배열

int[][] score = new int[2][3]; // 배열 생성


int[][] arr = {
	{1, 2, 3},
	{4, 5, 6}
    } // 배열 초기화

 

+) 그 외 

equals() 와 == 는

https://sudo-minz.tistory.com/93

 

[Java] 자바 문자열 비교 == equals() 차이점

Java에서 int와 boolean과 같은 일반적인 데이터 타입의 비교는 ==이라는 연산자를 사용하여 비교한다. 하지만 String처럼 Class의 값을 비교할때는 == 대신 equals()라는 메소드를 사용해 비교하는데 어떨

sudo-minz.tistory.com

이분 블로그로 공부함!

그럼 오늘 공부는 여기서 끝~