https://opentutorials.org/course/1223/4551
언어소개 - 생활코딩
Java의 역사 1995년 자바의 아버지라고 불리는 제임스 고슬링과 그의 동료들에 의해서 시작된 프로젝트다. Java는 원래 가전제품을 제어하기 위한 언어로 고안되었지만 웹의 등장으로 엄청난 성공
opentutorials.org
'생활코딩'의 Java 관련 수업을 바탕으로 공부한 내용을 정리해 보려고 한다. (블로그에 퍼가도 괜찮다고 기재되어 있어서 블로그에 쓸 예정ㅎㅎ)
(1) 언어 소개
처음에는 가전제품을 제어하기 위한 언어로 고안되었는데 웹이 등장하면서, 특히 SI(System Integration, 시스템 통합) 프로젝트가 이루어지며 주류로 자리잡았고, 안드로이드가 높은 점유율을 차지하면서 자바의 수요도 급증했다.
객체지향 언어이기 때문에 이 부분이 어렵게 느껴질 수 있다고 하지만, 안드로이드 프로그래밍을 원하거나 그게 아니어도 우리 나라는 자바가 주류 언어로 쓰이고 있기 때문에 좌절하지 않고 도전해 보는 것으로 하자!
<Java 공부 시 참고할 만한 소스들>
1. 자바 홈페이지 http://docs.oracle.com/javase/
JDK 19 Documentation - Home
The documentation for JDK 19 includes developer guides, API documentation, and release notes.
docs.oracle.com
2. 난 정말 자바를 공부한 적이 없어요 http://www.orentec.co.kr/teachlist/JAVA_BASIC_1/teach_sub1.php
====== 오렌지 미디어 ======
목록 서버1 서버2 강의시간 강의교안 Chapter 01. Let's Start JAVA! 01-1. 자바의 세계로 오신 여러분을 환영합니다. 32:59 01-2. 자바 프로그램의 이해와 실행의 원리
www.orentec.co.kr
3. 소설 자바 http://www.jabook.com/
4. 점프 투 자바 https://wikidocs.net/book/31
점프 투 자바
**초보 프로그래머를 위한 자바 입문서** 이 책은 문법위주의 지식보다는 이해중심의 지식을 전달하는 것을 주 목적으로 한다. 예를 들어 자바에서 잘 파악하기 힘든 개념 중 …
wikidocs.net
(2) Java의 설치 및 실행
<자바 프로그램의 동작>
1. 코드 작성
2. 컴퓨터가 실행할 수 있는 형태로 코드를 컴파일
3. 컴파일된 프로그램 실행
<용어>
- Java SE(Java Platform, Standard Edition) : 자바의 표준안. 소프트웨어의 명세서(specification, 즉 설계도).
현재는 Java SE 7을 기준으로 만들어진 버전 7이 라이브 되고 있음.(2013년 12월 기준)JCP(Java Community Process)라는 조직을 통해 만들어짐.
- JDK(Java Development Kit) : Java SE에 따라 만들어진 구체적인 소프트웨어. 개발자는 JDK를 다운받아 설치해야 하는데, 여기에 컴파일러와 개발에 필요한 각종 도구, JRE가 포함되어 있음. 개발자를 위한 자바 버전
- JRE(Java Runtime Environment) : 자바가 실제로 동작하는 데 필요한 JVM, 라이브러리, 각종 파일들이 포함되어 있음. 자바로 만들어진 프로그램을 구동하는 데 필요함. 일반인을 위한 자바 버전
- JVM(Java Virtual Machine) : 자바가 실제로 구동하는 환경. 운영체제 버전에 따라 JVM만 만들면, 하나의 자바 프로그램을 어떤 환경(운영체제, 하드웨어)에서도 실행할 수 있도록 해줌.
<설치> - windows 기준
① 'java jdk download' 검색해서 다운로드 페이지로 이동
https://www.oracle.com/java/technologies/downloads/
Download the Latest Java LTS Free
Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.
www.oracle.com
② 운영체제 버전에 맞게 다운로드
'설정 - 시스템 - 정보'에서 확인 가능. 나는 64비트 운영 체제.
아래 3가지는 찾아보니 파일 형식이 zip, exe, msi로 다르긴한데 정확한 차이는 잘 모르겠다. 그냥 2번째 installer로 받으면 되는 듯 하다.
③ 환경 변수 설정
자바 프로그램 작성에 필요한 도구들이 아래와 같은 경로의 bin 폴더에 저장되어 있음.
이 도구들이 어떤 디렉토리에서도 실행될 수 있도록 하려면 OS의 path라는 환경 체제에 등록해야 한다.
시스템 속성 > 환경 변수에 진입.
1) 'JAVA_HOME'이라는 이름으로 시스템 변수를 새로 만든다. (변수 값은 bin 폴더가 포함된 폴더의 경로! bin 폴더의 경로 X)
2) 시스템 변수 中 'Path' 변수에 대해 편집을 선택하고, '%JAVA_HOME%\bin' 값을 새로 만든다.
④ 확인
윈도우+R 키로 실행 창 실행. 'cmd'입력해서 명령 프롬포트 띄우고, 'javac' 명령어 입력했을 때 아래와 같이 javac 프로그램이 출력되면 정상적으로 등록이 된 것이라고 한다.
<실행> - windows 기준
윈도우에서 자바 코드를 작성해서 수동으로 컴파일 한 후 virtual machine을 통해 실행하는 방법
① 소스코드 만들기
메모장에 아래와 같이 코드를 입력하고, 'Helloworld.java' 이름으로 저장해서 소스코드를 만든다.
나는 바탕화면에 'java_tutorial' 폴더를 만들어서 저장했다.
② 컴파일 하기
컴파일은 사람이 작성한 코드를 컴퓨터가 이해할 수 있도록 변환해주는 것이다.
명령 프롬포트 띄우고 (윈도우+R 키로 실행 창 실행 → 'cmd'입력)
1) 'cd C:\Users\User\Desktop\java_tutorial(소스코드가 들어있는 폴더의 경로)' 입력해서 소스코드가 있는 폴더로 이동.
2) 'dir/w' 해당 폴더에 있는 파일들 확인. 'Helloworld.java' 파일이 있는 것을 볼 수 있음.
3) 'javac Helloworld.java' 입력한 후 다시 'dir/w'로 해당 폴더에 있는 파일들 확인. 'Helloworld.class'파일이 생김.
여기서 class 파일은 virtual machine이 이해할 수 있는 byte code로 이루어져 있는 파일임.
4) 'java Helloworld' 명령어를 통해 virtual machine에게 class 파일 전달!
(3) 개발도구와 이클립스
이클립스(Eclipse)는 가장 대표적인 자바의 개발도구이다.
IDE(Integrated Development Environment), 즉 통합 개발 환경에 해당하는 SW이다. IDE는 소스 편집기, 컴파일러, 디버거, 유닛 테스트와 같은 도구들이 결합되어 있는 SW를 말한다.
이클립스는 오픈소스이고, 무료이고, 모든 운영체제를 지원한다. 또한 이클립스를 기반으로 하는 다양한 에디터가 존재해서 다양한 언어에 대해 사용 가능하다.
다운로드는 아래 사이트에서 가능하다.
https://www.eclipse.org/downloads/
Eclipse Downloads | The Eclipse Foundation
The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 415 open source projects, including runtimes, tools and frameworks.
www.eclipse.org
위 페이지에서 다운로드 받는다.
실행해 보면 아래와 같은 화면이 나온다.
(4) 이클립스의 기능과 project 실행
각각의 기본적인 구성요소(view)들에 대해 살펴보자. (Window - Show View에서 편집 가능)
- Package Explorer : 프로젝트 관리
- Outline : 소스코드의 문법적인 요소들을 시각적으로 표시
- Problems : 소스코드의 문제를 알려줌
- Console : 출력된 결과를 보여줌
- 가운데 회색 부분 : 소스 코드를 작성하는 에디터
Window - Perspective - Open Perspective에서 아래와 같은 perspective들도 선택할 수 있음.
e.g. Debug perspective를 선택하면 debug할 때 유용하게 쓰이는 view들이 적절하게 배치되게 화면 구성이 됨.
여기까지 eclipse를 대강 살펴 보았고, 이제 project를 생성해 보겠다.
위에서 윈도우에서 자바를 실행했던 것과 겹치지 않도록 새롭게 'eclipse_tutorial' 폴더를 만들고 여기에 프로젝트를 생성했다.
프로젝트를 생성하면 위와 같은 폴더들이 생성된다.
- bin : binary 코드가 저장됨. class 확장자. eclipse로 컴파일한 코드, 즉 실제 실행될 코드가 여기 저장됨.
- src : source 코드가 저장됨. java 확장자. eclipse에서 자바로 작성한 코드가 여기 저장됨.
package는 project의 이름이 중복되어도 문제가 생기지 않도록 하기 위한 것이다. (파일을 저장할 때 디렉토리가 다르면 이름이 중복되어도 괜찮은 것처럼, package는 directory의 역할을 하는 것이다.)
package 이름으로는 주로 겹치지 않도록 도메인을 사용한다. '.'은 디렉토리를 구분해주는 역할을 한다.
생성한 package 안에 새로운 class를 생성한다.
1) 이름은 'Helloworld'로
2) Modify는 public으로
3) public static void main (String[] args) 체크
해서 class 생성하면 오른쪽 사진처럼 package 내에 'Helloworld.java' 파일이 생기고, 코드를 입력할 수 있는 창이 나타난다.
System.out.println("Hello world");
main 함수 안에 Hello world를 출력하는 코드를 넣고 실행하면 ('Run Helloworld' 버튼)
console 창에 Hello world가 잘 출력된다. package 생성할 때 설정한 디렉토리에 파일도 잘 생성된 것을 볼 수 있다.
(5) 숫자와 문자
<숫자>
자바에서는 따옴표가 없는 숫자는 숫자로 인식한다.
- 정수 : 1, 2...
System.out.println(1+2);
=> 결과 3
- 실수 : 1.2, 1.3...
System.out.println(1.2+1.3);
=> 결과 2.5
- 곱하기 : *
System.out.println(2*5);
=> 결과 10
- 나누기 : /
System.out.println(6/2);
결과 3
<문자>
- 문자(Character) : 한 글자, '(작은따옴표) ☆ 문자는 큰따옴표로 감싸도 OK. 단, 문자열로 인식.
System.out.println('생'); // 문자로 인식
- 문자열(String) : 여러 개의 문자의 결합, "(큰따옴표) ★ 문자열을 작은 따옴표로 감싸면 에러 발생!!
System.out.println("생"); //문자열로 인식
System.out.println("생활코딩");
- 이스케이프(escape) : 문자열 안에 큰따옴표를 포함하고 싶을 때, " 앞에 \를 위치시키면 큰따옴표가 문법적 역할에서 도망쳐서 단순히 문자로 인식되도록 함
System.out.println("egoing said \"Welcome programming world\"");
- 여러 줄 표시 : \n
System.out.println("HTML\nCSS\nJavaScript\n");
- 문자의 연산 : 문자열과 문자열을 이을 때는 + 연산자 사용
System.out.println("생활"+"코딩");
한글 깨짐 오류 - 해결 안됨...
(6) 변수(Variable)
변할 수 있는 수, 데이터를 담는 컨테이너
Why? 왜 변수가 필요한가?
중복을 제거함으로써 가독성↑, 유지보수성↑
How?
변수 선언(데이터 형식 + 변수 이름)을 하고, 변수에 값을 할당해서 사용한다.
int a; // 변수 선언
a = 1; // 할당
- 정수 int
int a;
a = 1;
System.out.println(a+1); //2
- 실수 double
double a = 1.1;
System.out.println(a+1.1); // 2.2
a = 2.1;
System.out.println(a+1.1); // 3.2
★ 정수형 변수에 실수값을 할당하면 오류가 발생한다.
자바는 데이터 형식에 맞지 않는 데이터를 입력하면 프로그램이 실행되지 않음.
(Bad) 코드를 작성하는 데에는 불편함이 있지만, (Good) 추후 데이터 타입으로 인한 오류를 예방할 수 있음.
- 문자열 String
String first = "coding"; // 변수 선언 + 할당 한 줄로 해결
System.out.println(first+" "+"everybody");
String a, b; // 여러개의 변수 동시 선언
a = "coding";
b = " everybody";
System.out.println(a+b); // coding everybody
(7) 주석과 세미콜론
- 주석(comment) : 로직에 대한 설명이나 코드 비활성화, 프로그래밍적으로 해석 X
- 한 줄 주석 : //
- 여러줄 주석 : /* */
- JavaDoc 주석 : 자바 문서 만들 때 사용, /**로 시작
/**
* Prints an integer and then terminate the line. This method behaves as
* though it invokes <code>{@link #print(int)}</code> and then
* <code>{@link #println()}</code>.
*
* @param x The <code>int</code> to be printed.
*/ // 이 부분이 문서로 생성됨
public void println(int x) {
synchronized (this) {
print(x);
newLine();
}
}
- 세미콜론 : 문장의 끝. 자바에서 문장 끝에 세미콜론 사용하지 않으면 컴파일 에러 발생.
int a = 100; double b = 10.1; // 여러 문장 한 줄에 표현 가능
(8) 데이터 타입
<데이터의 크기>
8 bit | 1byte |
1024 byte | 1kilobyte |
1024 kilobyte | 1 megabyte |
1024 megabyte | 1 gigabyte |
1024 gigabyte | 1 terrabyte |
1024 terabyte | 1 petabyte |
1024 petabyte | 1 exabyte |
1024 exabyte | 1 zettabyte |
<정수형>
데이터 타입 | 메모리 크기 | 표현 가능 범위 |
byte | 1 byte | -128 ~127 |
short | 2 byte | -32,768 ~ 32,767 |
int | 4 byte | -2,147,483,648~2,147,483,647 |
long | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
byte a;
a = 128; //type mismatch 에러. byte 127까지의 정수만 담을 수 있는 데이터 타입이다.
변수를 선언할 때 메모리가 할당되기 때문에, 표현 가능 범위가 넓어도 메모리 크기가 너무 큰 변수는 잘 사용하지 않음.
int가 빠르고, 충분히 큰 범위 표현 가능하기 때문에 주로 int 사용.
<실수형>
데이터 타입 | 메모리 크기 | 표현 가능 범위 |
float | 4 byte | ±(1.40129846432481707e-45 ~ 3.40282346638528860e+38) |
double | 8 byte | ±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d) |
<문자>
데이터 타입 | 메모리 크기 | 표현 가능 범위 |
char | 2 byte | 모든 유니코드 문자 |
<문자열>
데이터 타입 | 메모리 크기 | 표현 가능 범위 |
String | 2 byte * (문자 수) |
(9) 상수의 데이터 타입
변수와 달리 변하지 않는 값을 상수라고 한다.
상수 또한 데이터 타입을 가진다.
- 실수 표현
int a = 2.2; // type mismatch 에러
float a = 2.2; // type mismatch 에러
double a = 2.2; // OK. 2.2의 데이터 타입이 double임을 알 수 있음.
float a = 2.2F; // OK. F를 붙이면 데이터 타입이 float가 됨.
- 정수 표현
int a = 2147483648; // 오류. int의 최댓값인 2147483647보다 큼.
long a = 2147483648; // 오류. 변수는 long타입이지만, 2147483648는 int 타입임.
long a = 2147483648L; // OK. 변수와 상수 모두 long타입이 됨.
byte a = 100; // OK
short b = 200; // OK
자바는 편의상의 이유로 byte와 short 타입에 대해서는 int형을 허용.
(10) 형변환 (Type Conversion)
데이터의 타입을 변경하는 것.
Why?
같은 수여도 데이터 타입에 따라 완전히 다른 bit 값으로 저장된다. 따라서 형식이 다른 데이터끼리 연산하려면 한 쪽의 데이터 타입을 다른 쪽의 데이터 타입으로 맞춰주는 형변환을 해야 하는 것이다.
How?
- 자동 형 변환 (Implicit Conversion)
타입을 변경해도 정보의 손실이 일어나지 않는 경우, 즉 표현범위가 좁은 데이터 타입에서 넓은 데이터 타입으로의 변환만 허용됨.
(e.g.)
float → double : double이 더 많은 데이터를 표현할 수 있기 때문에, 형 변환이 일어나도 데이터 손실이 발생하지 않음.
double → float : 형 변환이 일어날 때 데이터 손실이 발생할 수 있음. 형변환 X.
int a = 3;
float b = 1.0F;
double c = a + b; // 1) 정수(int)->실수(float) 형변환 되면서 3.0F + 1.0F = 4.0F
// 2) float -> double 형변환 되면서 c에는 4.0 (double형) 저장됨.
- 명시적 형 변환 (Explicit Conversion)
자동 형 변환이 적용되지 않는 경우에는 수동으로 형 변환을 해야 함.
(데이터 타입) 데이터 값
float a = 100.0;
int b = 100.0F; // 둘 다 에러. 자동 형 변환X.
float a = (float)100.0; // double -> float 명시적 형 변환
int b = (int)100.0F; // float -> int 명시적 형 변환
(11) 연산자 (Operator)
대입 연산자, 산술 연산자, 비교 연산자, 논리 연산자 등 특정한 작업을 위해 사용하는 기호
- 산술 연산자
+ | 더하기 (숫자, 문자) |
- | 빼기 |
* | 곱하기 |
/ | 나누기 |
% | 나머지 |
정수, 실수 형식에 따라 결과값이 달라짐.
package org.opentutorials.javatutorials.operator;
public class DivisionDemo {
public static void main(String[] args) {
int a = 10;
int b = 3;
float c = 10.0F;
float d = 3.0F;
System.out.println(a/b); // 3
System.out.println(c/d); // 3.3333333
System.out.println(a/d); // 3.3333333, int->float 형 변환 일어난 후 연산.
}
}
- 단항 연산자
하나의 항을 대상으로 연산이 이루어지는 연산자
+ | 양수를 표현. 실제로 사용할 필요 X |
- | 음수를 표현 |
++ | 증가(increment). 항의 값을 1씩 증가 시킴. |
-- | 감소(decrement) |
package org.opentutorials.javatutorials.operator;
public class PrePostDemo {
public static void main(String[] args) {
int i = 3;
i++;
System.out.println(i); // 4 출력
++i;
System.out.println(i); // 5 출력
System.out.println(++i); // 6 출력
System.out.println(i++); // 6 출력
System.out.println(i); // 7 출력
}
}
- 연산의 우선순위
연산에는 우선 순위가 있고, 이 규칙에 의해 연산이 이루어진다는 것 정도만 이해하자.
(12) 비교와 Boolean
- Boolean : 참과 거짓을 의미하는 데이터 타입. true, false 두 가지 값을 가짐. 조건문에서 핵심적으로 사용됨.
- 비교 연산자 (관계 연산자) : ==, !=, >, >=, .equals
package org.opentutorials.javatutorials.compare;
public class EqualDemo {
public static void main(String[] args) {
System.out.println(1==2); //false
System.out.println(1==1); //true
System.out.println("one"=="two"); //false
System.out.println("one"=="one"); //true
}
}
package org.opentutorials.javatutorials.compare;
public class EqualStringDemo {
public static void main(String[] args) {
String a = "Hello world";
String b = new String("Hello world");
System.out.println(a == b); // false. a와 b의 데이터 타입이 일치하지 않음.
System.out.println(a.equals(b)); // true. 문자열 비교할 때는 .equals 사용해야 함.
// .equals : 문자열 비교할 때 사용하는 "메소드"
}
}
(13) 조건문
- If
if( true ) {
// 실행
}
if(false){
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
}
System.out.println(5); // 5만 출력
- else if, else
if( true ) {
// 실행
} else if( true ) {
// 실행
} else {
// if, else if 전부 실행되지 않았다면 실행
}
if(false){
System.out.println(1);
} else if(false) {
System.out.println(2);
} else if(true) {
System.out.println(3); // 3만 출력
} else {
System.out.println(4);
}
- 응용
- 중첩
- switch
(14) 논리 연산자
ㄴㅇㄹ
(15) 반복문
ㄴㅇㄹ
(16) 배열