INTRO

2025년 1월 9일 11일차 오후 수업부터 백엔드 과목이 시작되었습니다. 이번 포스팅에서는 백엔드 개발 환경 셋팅 및 JAVA의 특징에 대해 학습한 내용을 정리했습니다.

1. JDK, JRE

  • JDK: Java Development Kit (자바개발도구)
  • JRE: Java Runtime Environment (자바 실행환경)

.java단계 까지는 JDK, .class 단계는 JRE 환경에서 동작, JVM을 통해 실행한다.

  • JDK : Java SE Development Kit 11.0.24, jdk-11.0.24_windows-x64_bin.exe
    설치 완료 후 아래 명령어로 완료 여부 확인.

    C:> java -version
    java version "11.0.24" 2024-07-16 LTS
    Java(TM) SE Runtime Environment 18.9 (build 11.0.24+7-LTS-271)
    Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.24+7-LTS-271, mixed mode)

2. IDE ⇒ Eclipse

개발 및 빌드 및 디버깅 툴.

  • Eclipse : Eclipse IDE 2024-12 R Packages, Eclipse IDE for Enterprise Java and Web Developers, Windows x86_64

- jdk 설정

- 컴파일러 버전 맞추기

3. JAVA의 특징

  • 플랫폼 독립적
    JVM만 설치돼있다면, 실행파일이 운영체제에 종속되지 X
  • 객체지향 언어
  • 함수형 코딩 지원
  • 분산 처리 지원
  • 멀티쓰레드 지원

4. JAVA 프로젝트 생성 및 실행

예) 프로젝트(Test) 생성 -> 패키지(mypack) 추가 -> class 파일(Test.java) 추가

5. 메서드 오버로딩 (method overloading)

같은 이름의 메서드를 매개 변수의 타입, 갯수, 순서를 다르게 해서 여러 개로 정의한다. (반환 타입은 포함되지 않음)
자바의 다형성(polymorphism) 개념의 구현.

System.out.println() => 인자값을 콘솔에 출력하고 개행문자를 처리
System.out.print() => 인자값을 콘솔에 출력
System.out.printf() => 형식 문자열을 이용해서 출력

6. 엄격한 Data Type 적용

변수 선언 시 변수가 가지는 데이터 타입을 지정

int a;

7. 변수 이름 규칙

상수 이름과 메서드 이름 규칙이 동일하다.

  • 영문대소문자 및 한글 사용이 가능
  • 특수문자는 두 가지만 사용이 가능 ⇒ _ $
  • 숫자 사용이 가능하나, 첫번째로는 올 수 없음
  • 자바에서 사용중인 키워드는 사용할 수 없음

- 변수, 메서드명 권고 사항

  • 변수 이름은 소문자로 시작
  • 두 개 이상의 단어가 결합되는 경우, 새 단어는 대문자로 시작 ⇒ 카멜 표현식

- 상수명 권고 사항

  • 상수 이름의 모든 문자를 대문자로 표기 ⇒ 예) PI
  • 두 개 이상의 단어가 결합된 경우, _로 연결 ⇒ 예) MY_DATA

8. 변수의 생존기간(scope)

변수는 선언된 시점에 생성되고, 생성된 변수는 자신이 선언된 열린 중괄호({)의 쌍인 닫힌 중괄호(})를 만나면 메모리에서 삭제.

9. 자료형(Data Type)

- 기본 자료형(primitive)

값이 스택에 저장 ⇒ 크기가 고정.

  • boolean : true, false
  • 정수 : byte(1), short(2), int(4), long(8)
  • 실수 : float(4), double(8)
  • 문자 : char(2)

- 참조 자료형(reference)

실제 값은 힙에 저장되고, 스택에는 그 주소가 저장 ⇒ 크기가 가변

  • 문자열, 배열, 클래스, 인터페이스, ...

JVM 메모리 구조

메모리 초기화

[스택메모리]

  • 초기값을 부여하지 않는 경우 빈 칸으로 존재
  • 읽기 불가능
  • int a;
  • System.out.println(a); // 오류 발생

[힙메모리]

  • 빈 칸으로 존재할 수 없으며, 디폴트 초기값이 강제 설정
  • 기본 자료형 ⇒ 숫자 : 0 / boolean : false
  • 참조 자료형 ⇒ null

- 쇼트 서킷 (short circuit)

연산을 수행하는 과정에서 결과가 이미 확정됐을 때 나머지 연산 과정을 생략

// | 연산 => 모든 연산을 수행 후 결과를 비교

	// java.lang.NullPointerException 예외가 발생
	String s = null;
	if (5 > 3 | s.equals("abc")) {
		System.out.println("^^;;;");
	}

	
	// || 연산 => 결과가 확정되면 연산을 생략하므로 예외가 발생하지 않음
	String s = null;
	if (5 > 3 || s.equals("abc")) {
		System.out.println("^^;;;");
	}		
    

- 타입 변환 메서드

  • 문자열 → 정수 ⇒ Integer.parseInt(문자열)
  • 문자열 → 실수 ⇒ Double.parseDouble(문자열)
  • 정수 → 문자열 ⇒ String.valueOf(정수)
  • 실수 → 문자열 ⇒ String.valueOf(실수)

- String 클래스의 특징

new 키워드를 이용해서 객체를 생성하면 항상 새로운 객체를 생성.
문자열 리터럴로 생성하면 동일한 문자열을 포함하고 있는 객체가 있으면 그 객체를 공유.

10. 제어문

선택 제어문 : if, switch
반복 제어문 : for, while, do-while
제어 키워드 : break, continue

11. 클래스

객체(object)는 사용할 수 있는 실체를 의미 ⇐ 붕어빵
클래스(class)는 객체를 만들기 위한 설계도 ⇐ 붕어빵 틀

하나의 클래스를 이용해서 여러 개의 객체를 만들 수 있음

  • 클래스 외부에서 메서드 호출 ⇒ 참조변수를 이용해서 메서드를 호출 ⇐ 객체를 먼저 생성
  • 클래스 내부에서 메서드 호출 ⇒ 객체를 생성하지 않고 호출이 가능 (단, static이 붙어 있는 메서드는 static이 붙어 있는 필드 또는 메서드만 호출이 가능)

12. 상속

기억해두어야 할 예시 2가지

class A {
	int m = 3;
	void abc() {
		System.out.println("A");
	}
}

class B extends A {
	int n = 4;
	void bcd() {
		System.out.println("B");
	}
}


public class MyTest {
	public static void main(String[] args) {
		{
			// B의 객체를 B 타입으로 선언
			B b = new B();
			System.out.println(b.m);	// 3
			System.out.println(b.n);	// 4
			b.abc();	// A
			b.bcd(); 	// B
		}
		
		{
			// B(자식)의 객체를 A(부모) 타입으로 선언했을 때
			A a = new B();
			System.out.println(a.m);	// 3
			System.out.println(a.n);	// X
			a.abc();	// A				
			a.bcd();	// X				
		}
	}	
}
class A {
	void print() {
		System.out.println("A 클래스");
	}
}

class B extends A {
	// 오버라이딩
	@Override
	void print() {
		System.out.println("B 클래스");
	}
}


public class MyTest {
	public static void main(String[] args) {
		A aa = new A();
		aa.print();		// A 클래스
		
		B bb = new B();
		bb.print();  	// B 클래스
		
		A ab = new B();
		ab.print();  	// B 클래스
	}	
}

메서드는 (자식으로) 덮어쓰기 되는데, 필드는 (부모로) 유지된다. (단, static 메서드는 오버라이딩 되지않음 == 부모로 나온다.)

class A {
	static int m = 3;
	void print() {
		System.out.println("A");
	}
}

class B extends A {
	static int m = 4;
	void print() {
		System.out.println("B");
	}
}

public class MyTest {
	public static void main(String[] args) {
		// 클래스 이름을 이용해서 static 필드에 접근
		System.out.println(A.m);		// 3
		System.out.println(B.m);		// 4
		
		A aa = new A();
		B bb = new B();
		A ab = new B();
		
		// 인스턴스 변수를 이용해서 static 필드에 접근 => warning이 발생
		// The static field A.m should be accessed in a static way
		System.out.println(aa.m); 		// 3
		System.out.println(bb.m);		// 4
		System.out.println(ab.m);		// 3
		System.out.println(((B)ab).m);	// 4
	}
}

OUTRO

한동안 react 어렵다가, 플젝하면서 익숙해졌다가, 쉬운 java 개념을 보게되니 머리가 맑아지는 느낌입니다. 빨리 spring 실습하고싶습니다.!!!

profile
지니니

0개의 댓글