LG CNS AM CAMP 1기/AI 서비스 개발을 위한 백엔드 I

1일차_JAVA 개발 환경 & Java 프로그래밍 언어 기본 문법

solog 2025. 1. 9. 23:18

1주차 자바 기초
- Java 개발 환경 구성
- Java 프로그래밍 언어 기본 문법

 

25.01.09 (목)

강의 책 : 자바/스프링 개발자를 위한 실용주의 프로그래밍 (위키북스, 김우근 저)

아래의 내용은 [LG CNS AM CAMP 1기] 수업을 바탕으로 작성하였습니다.

 

<클래스/객체>

- 클래스라는 개념으로 묶어서 데이터와 데이터조작 함수를 묶어놔서 클래스에 있는 함수 내에서 변경하는 규칙들을 통제한다.

- 데이터와 함수를 묶어 놓은 것이다.

- 데이터가 잘못 변형되는 것을 막는다.

- 코드의 재사용성을 극대화 시킨다.

 

<JDK, JRE>

.java -------------> .class -----------> JVM을 통해서 실행

         javac 도구              java 도구

- jdk는 개발도구

- jre 실행환경

- 두개의 차이점은 jdk는 jre를 포함하고 있고, jre 이외에 자바 파일을 컴파일하고 개발하는 도구들을 포함하고 있다.

- jvm은 가상머신

- 소스코드를 만들고 소스코드를 실행 가능한 형태로 만들 때 jdk가 필요

- 바뀐 class는 jvm을 통해 실행되는데 이러한 라이브러리는 jre만 있으면 된다.

 

<IDE ⇒ Eclipse>

https://www.eclipse.org/downloads/packages/

- 통합개발환경

- 개발에 필요하는 것들을 다 묶어 놓음

- 소스코드를 편집할 수 있음 => 코드 작성 시 도움 받을 수 있다. (예시로 자동완성기능, 문법 체크 등)

- 코드를 빌드 할 때 도움을 받을 수 있다. (쉽게 빌드 가능)

- 코드 디버깅 툴을 통해 트레이스 등을 가능하게 한다.

 

<이클립스 단축키>

 

<자바 특징>

 

 

 

- jvm이 설치되어있으면 내가 만든 코드는 어디에서 돌아간다.

- 객체지향언어 : 클래스라는 문법을 이용해 객체를 정의해 클래스의 인스턴스를 가져와 프로그램을 만들수있도록 지원

 

<플랫폼 종속>

- 어떤 프로그램을 만들면 각 실행파일은 각 운영체제에만 실행 가능 한 것이 플랫폼 종속된 것이다.

<플랫폼 독립>

- 운영체제 영역하고 어플리케이션 영역 사이에 가운데에 중간다리역할 즉, JVM을 넣어서 실행하게 하는 것

- JVM만 운영체제별로 다운받아 놓으면 각 운영체제에 상관없이 내가 만든 파일을 실행시킬 수 있다.

- 안돼는 경우가 있는데 이를 보안하기 위해 '컨테이너' 기술 (가상화기술)이 나옴

 

- JDK: Java Development Kit (자바개발도구)

- JRE: Java Runtime Environment (자바 실행환경)

<자바 프로젝트 생성 및 실행>

- 소스코드들을 의미단락으로 묶어주는데, 이것을 패키지라고 한다.

- 디렉토리 아래에 자바파일을 만들어 class 파일로 컴파일하여 자동으로 만들어준다.

- main 함수가 있으면 시작하는 소스코드가 된다.

- 패키지는 논리적인 구조로 이루어져 있다.

 

[코드]

C:\Users\myanj\eclipse-workspace\Test> tree . /f (tree ./f 는 해당 파일의 구조를 보기위한 코드)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ⇐ Test 프로젝트 디렉터리

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ⇐ 이클립스의 워크 스페이스 디렉터리

~~~~~~~~~~~~~~ ⇐ 사용자 홈 디렉터리

         ~~~~~

         현재 PC에 로그인한 사용자 계정

 

[코드 결과]

폴더 PATH의 목록입니다.

볼륨 일련 번호는 6C07-B63C입니다.

C:\USERS\MYANJ\ECLIPSE-WORKSPACE\TEST

│  .classpath

│  .project

├─.settings

│      org.eclipse.core.resources.prefs

│      org.eclipse.jdt.core.prefs

├─bin

│  └─mypack ⇐ src 디렉터리 아래의 디렉터리와 소스 파일이 컴파일되어서 자동으로 생성

└─src

    └─mypack ⇐ src 디렉터리 아래에 패키지 이름의 디렉터리가 생성

 

<자바 파일을 생성>

- 자바 파일을 생성하는 것은 class 파일을 생성하는 것이다. 

 

[코드와 결과]

C:\Users\myanj\eclipse-workspace\Test> tree . /f

폴더 PATH의 목록입니다.

볼륨 일련 번호는 6C07-B63C입니다.

C:\USERS\MYANJ\ECLIPSE-WORKSPACE\TEST

│  .classpath

│  .project

├─.settings

│      org.eclipse.core.resources.prefs

│      org.eclipse.jdt.core.prefs

├─bin

│  └─mypack

│          Test.class ⇐ 이클립스가 자동으로 컴파일해서 추가한 파일

└─src

    └─mypack

            Test.java ⇐ 개발자가 추가한 파일

 

- 개발자가 추가한 파일에 오류가 나면 컴파일이 실행되지 않아 bin 파일에 파일이 생성되지 않는다.

 

[코드]

package mypack;
public class Test {
	public static void main(String[] args) { 
		System.out.println("Hello, Java!!!");
	}
}

//public 외부 참조 가능
//static 인스턴스 만들지 않고 main 호출 하겠다.
// void 결과 리턴 하는게 없다.
// String[] 문자열 배열로 넘어온다.
// println 은 출력하라는 의미.

 

[코드 해석]

package mypack;

~~~~~~~~~~~~~~

패키지 이름

 

public class Test {

~~~~~~       ~~~~

|                   클래스 이름 = java 파일명

+-- 접근 지정자(제한자, modifier)

 

                    public static void main(String[] args) { ⇐ 해당 클래스를 실행할 때 처음으로 호출되는 메서드

                                                                                   main 메서드를 가지고 있는 클래스 ⇒ 실행 클래스 (독립적으로 실행가능)

                                                                                   main 메서드를 가지고 있지 않은 클래스 ⇒ 라이브러리 클래스

                        System.out.println("Hello, Java!!!"); ⇐ 문자열을 콘솔에 출력

                     }

}

 

<실행>

- 디버그 모드로 실행하 디버깅 기능을 사용할 수 있다. (중간 실행 중단, 임의의 값 전달 등)

 

[파일 구조]

C:\Users\myanj\eclipse-workspace> tree .\Test03 /f

폴더 PATH의 목록입니다.

볼륨 일련 번호는 6C07-B63C입니다.

C:\USERS\MYANJ\ECLIPSE-WORKSPACE\TEST03

│  .classpath

│  .project

├─.settings

│      org.eclipse.core.resources.prefs

│      org.eclipse.jdt.core.prefs

├─bin

│  └─abc

│      └─bcd

│              Test.class

└─src

    └─abc

        └─bcd

                Test.java ⇐ abc.bcd.Test

                                    ~~~~~~~

                                   패키지 명에 포함된 점은 디렉터리로 구분 

                                   ⇒ 패키지는 자바 파일을 구분하는 수단으로 사용 

                                   ⇒ 패키지 이름을 유일하게 만드는 방법이 필요 

                                   ⇒ 도메인 이름의 역순으로 표기 (겹치지 않으므로)

                                   예) naver.com ⇒ com.naver.MyTest

                                        daum.com ⇒ com.daum.MyTest

 

<주석 (Comment)>

- 소스코드에 실행되지 않는 설명문

- 주석 표현 3가지 존재

- 문서화 주석 : 문서를 자동으로 만들어준다. (Java doc string)

 

[코드]

package mypack;

/**
 * 문서화 주석
 * 
 * @author 홍길동
 */
public class Test {
	/**
	 * main 메서드
	 * @param args 실행 시 전달되는 매개변수를 배열 형태로 전달
	 */
	public static void main(String[] args) {
		// 인라인 주석 => 주석 기호 이후의 내용을 해석하지 않음 (Ctrl + /)
		
		/*
		   주석 기호 내의 모든 내용을 해석하지 않음 (Ctrl + Shift + /)
		 */
		System.out.println("Hello, Java!!!");
	}
}

 

 

<클래스 이름과 자바 파일간의 관계>

- 클래스 이름이 자바 파일 이름이다.

 

[코드]

package com.test;

// Java 파일명과 동일한 클래스에만 public 접근 지정자를 붙일 수 있음
public class MyTest {	// MyTest.class
	
}

class A {				// A.class
	
}

class B {				// B.class
	class C {			// B$C.class <= 내부 클래스(클래스 안 클래스)
		
	}
}

 

[파일 구조]

C:\Users\myanj\eclipse-workspace\Test> tree . /f

폴더 PATH의 목록입니다.

볼륨 일련 번호는 6C07-B63C입니다.

C:\USERS\MYANJ\ECLIPSE-WORKSPACE\TEST

│  .classpath

│  .project

├─.settings

│      org.eclipse.core.resources.prefs

│      org.eclipse.jdt.core.prefs

├─bin

│  ├─com

│  │  └─test

│  │          A.class

│  │          B$C.class

│  │          B.class

│  │          MyTest.class

│  │

│  └─mypack

│          Test.class

└─src

    ├─com

    │  └─test

    │          MyTest.java

    │

    └─mypack

            Test.java

 

< println(), print(), printf() 메서드 >

=> 메서드 오버로딩 (method overloading)

 

< 메서드 오버로딩 (method overloading) >

- 메서드 오버로딩 : 같은 이름의 메서드를 매개 변수의 타입, 개수, 순서를 다르게 해서 여러 개 정의 (반환 타입은 포함되지 않음)

- 자바의 다형성(polymorphism) 개념의 구현 

 

package com.test;

public class MyTest {
	public static void main(String[] args) {
		// System.out.println() => 인자값을 콘솔에 출력하고 개행문자를 처리 
		System.out.println(); 		// 한 줄 띄우기
		System.out.println("문자열");
		System.out.println(1234);
		System.out.println(true);
		
		// System.out.print() => 인자값을 콘솔에 출력 
		System.out.print("문자열");
		System.out.print(1234);
		System.out.print(true);
		
		// 개행문자(\n)를 출력
		System.out.print("개행문자를 포함\n");
		System.out.print("다음 줄에 출력\n");
		
		// System.out.printf() => 형식 문자열을 이용해서 출력
		//                        ~~~~~~~~~~~
		//                        데이터의 출력 형식을 지정하는 %로 시작하는 문자열
		System.out.printf("%s 문자열 출력\n", "이것은 문자열입니다.");
		System.out.printf("%d 숫자 출력\n", 1234);
		System.out.printf("%d : %f : %4.2f\n", 100, 15.66666, 15.66666);
	}	
}

 

< 엄격한 Data Type 적용>

- 자바는 변수의 타입을 지정해서 그 타입만 사용할 수 있게 한다.

package com.test;

public class MyTest {
	public static void main(String[] args) {
		// 변수 선언 시 변수가 가지는 데이터 타입을 지정
		int a;
		
		a = 123;
		a = 123.0;	// Type mismatch: cannot convert from double to int
		a = "abc";	// Type mismatch: cannot convert from String to int
	}	
}

 

< 변수 이름 규칙 = 상수 이름과 메서드 이름 규칙과 동일 >

- 영문대소문자 및 한글 사용이 가능

- 특수문자는 두 가지만 사용이 가능 ⇒ _ $

- 숫자 사용이 가능하나, 첫번째로는 올 수 없음 

- 자바에서 사용중인 키워드는 사용할 수 없음

 

[변수, 메서드 이름 권고 사항]

- 변수 이름은 소문자로 시작

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

 

[상수 이름 권고 사항]

상수 이름의 모든 문자를 대문자로 표기 ⇒ 예) PI 

두 개 이상의 단어가 결합된 경우, _로 연결 ⇒ 예) MY_DATA

 

package com.test;

public class MyTest {
	public static void main(String[] args) {
		// 변수 명명법
		boolean aBcD;		// O 가능하지만 권고 위배
		byte 가나다; 		// O
		short _abcd;		// O
		char $ab_cd;		// O
		int 3abcd;			// X 숫자로 시작
		long abcd3; 		// O
		float int;			// X 예약어를 사용
		double main; 		// O
		int my Work;		// X 공백을 포함
		String myClassName;	// O
		int ABC;			// O 가능하지만 권고 위배 (상수 표기법)
		
		// 상수 명명법
		final double PI; 	// O
		final int MY_DATA;	// O
		final float myData; // O 가능하지만 권고 위배 (변수 표기법)
	}	
}

 

< 변수의 생존기간(scope)  >

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

package com.test;

public class MyTest {
	public static void main(String[] args) {
		int a = 10;
		System.out.println("#1 : " + a);		// 10
		
		{
			int b = 20;
			System.out.println("#2 : " + a);	// 10
			System.out.println("#3 : " + b);	// 20
		}
		
		{
			int b = 30;
			System.out.println("#4 : " + a);	// 10
			System.out.println("#5 : " + b);	// 30
		}
		
		System.out.println("#6 : " + a);		// 10
		System.out.println("#7 : " + b);		// b cannot be resolved to a variable
	}	
}

 

< 자료형(Data Type) >

- 자바는 자료형을 중요시 하는 언어이다.

 

기본 자료형(primitive) ⇒ 값이 스택에 저장 ⇒ 크기가 고정

- 일반적으로 소문자로 시작 

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

참조 자료형(reference) ⇒ 실제 값은 힙에 저장되고, 스택에는 그 주소가 저장 ⇒ 크기가 가변 

- 일반적으로 대문자로 시작 

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

 

< JVM 메모리 구조>

 

< 기본 자료형>

- long 타입에 L을 뒤에 붙여야 long 타입임을 표현할 수 있다.

- float 타입에는 F를 붙여야 float 타입임을 표현할 수 있다. (그렇지 않으면 double로 인식한다.)

 

- 문자의 유니코드를 통해 그림을 표현할 수 있다.

package com.test;
public class MyTest {
public static void main(String[] args) {
char heart = '\u2665';
System.out.println(heart);
      }
}

 

- 문자의 유니코드 검색 https://unicode-table.com/

 

SYMBL (◕‿◕) Symbols, Emojis, Characters, Scripts, Alphabets, Hieroglyphs and the entire Unicode

Explore symbols, characters, hieroglyphs, scripts, and alphabets on SYMBL (◕‿◕). Find and copy 😎 Emojis, ❤ hearts, → arrows, ★ stars. Complete Unicode table, interesting facts, and technical information

symbl.cc

 

< 기본 자료형 간 타입 변환>

- 오늘 배우는 것 중 가장 중요한 내용 ★ ★ ★

- 리터럴이란 값 그자체를 의미한다.

- 리터럴 값은 자동으로 값이 자동 변환된다.

 

< 타입 변환 방법>

 

 

< 기본 자료형 간의 연산>

 

< 연산자>

 

< 쇼트 서킷 (short circuit)>

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

- 중요

 

 

< 대입 연산자 축약 표현>

 

<제어문과 제어 키워드>

- 선택 제어문 : if, switch

- 반복 제어문 : for, while, do-while

- 제어 키워드 : break, continue

 

[선택 제어문]

 

[반복 제어문]

 

[제어 키워드]