1일차_JAVA 개발 환경 & Java 프로그래밍 언어 기본 문법
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
[선택 제어문]
[반복 제어문]
[제어 키워드]