자바 소스코드 파일을 생성하면 컴퓨터가 읽을 수 있는 컴파일된 클래스(.class) 파일이 생성, 이를 자바 버츄얼 머신을 통해 컴퓨터가 실행
이클립스에서 만든 프로그램을 실행 시키려면 컴파일 단계를 거쳐야 한다. 빌드 자동화 옵션이 기본으로 설정 되어 있어 파일을 저장하면 자동으로 컴파일 된다.
자바 프로그램은 모두 클래스 기반 (클래스: 객체를 소스코드로 나타낸 것)
Compile(컴파일): 컴퓨터 언어로 번역
프로그램 : 명령(소스코드집합), 컴파일 된 결과물
Java SE(Standard Edition): 기본 개발 환경
Java ME(Micro Edition): 모바일 및 임베디드 시스템 개발
Java EE(Enterprise Edition): 서블릿이나 JSP등을 개발
1.객체 지향 언어 : 유지 보수가 쉽고 확장성이 좋다
프로그램이 안정적: 메모리를 직접 제어 X 오류 위험성이 낮다. 가비지 컬렉터로 메모리를 효율적으로 관리한다
알고리즘 라이브러리를 제공하는 자바 개발 키트 (JDK)가 있다. 클래스, 자료구조, 네트워크 입출력, 예외 처리 등에 최적화.
오픈 소스 이기 때문에 연동하여 기능을 빠르게 구현할 수 있다.
int i; // 변수선언
i = 10; // 변수 초기화
System.out.println("i = " + i);
int j = 20; // 변수 선언 & 초기화
System.out.println("j = " + j);
- 기본 자료형 :
char c = 'a';
int i = 10;
double d = 10.123;
boolean b = false;
- 객체 자료형 :
String str = "ABCDEFG";
- 배열 선언 및 초기화
// 배열 선언 후 초기화
int[] arr1 = new int[S];
arr1[0] = 100;
arr1[1] = 200;
arr1[2] = 300;
arr1[3] = 400;
System.out.println("arr1[0] : " + arr1[0]);
System.out.println("arr1[1] : " + arr1[1]);
System.out.println("arr1[2] : " + arr1[2]);
System.out.println("arr1[3] : " + arr1[3]);
// 배열 선언과 초기화를 동시에
int[] arr2 = {10, 20, 30, 40, 50};
System.out.println("arr2[0] : " + arr1[0]);
System.out.println("arr2[1] : " + arr1[1]);
System.out.println("arr2[2] : " + arr1[2]);
System.out.println("arr2[3] : " + arr1[3]);
- 메서드 선언 및 정의
// 메서드 선언
public void getInfo() {
// 메서드 정의
System.out.println("i");
System.out.println("i");
}
public : 접근자(전역 접근 허용)
void : 반환형(리턴되는 값이 없음)
- 메서드 호출
ChildClass childClass = new ChildCass();
childClass.getInfo();
- 매개 변수(parameter)
public void getInfo() {
~~~
}
// 매개변수는 자료형과 변수(지역변수)로 이루어진다
public void setInfo(int i, boolean b, double d, char c, String s) {
~~~
}
- 중복 메서드(overloading)
// 이름은 같고 매겨변수의 개수 또는 타입이 다른 메서드를 만들 수 있다.
public void getInfo(int x, int y) {
~~~
}
public void getInfo(String s1, Strings2) {
~~~
}
- 접근자
메서드를 호출할 때 접근자에 따라서 호출이 불가할 수 있다.
ex: private 메서드는 메서드 호출부에서 호출 불가능
private void getInfo() {
~~~
}
ObjectEx obj1 = new ObjectEx();
// 디폴트 생성자
public ObjectEx() {
~~~
}
ObjectEx obj2 = new ObjectEx(10);
// 사용자 정의 생성자
public ObjectEx(int i) {
num = i;
}
int arr[] = {10, 20, 30);
ObjectEx obj3 = new ObjectEx("java", arr);
// 사용자 정의 생성자
public ObjectEx(String s, int i[]) {
str = s;
nums = i;
}
- 소멸자 :
객체가 GC에 의해서 메모리에서 제거 될 때 finalize() 메서드가 호출
@Override
protected void finalize() throws Throwable {
super.finalize();
}
- this 키워드 :
현재 객체를 가릴킬때 사용
public ObjectEx(int i, String s, int is[]) {
this.num = i;
this.str = s;
this.numbs = is;
}
패키지명은 속해 있는 클래스가 최대한 다른 클래스와 중복되는 것을 방지하도록 만든다.
패키지 이름은 일반적으로 도메인을 거꾸로 이용.
- import :
다른 패키지에 있는 클래스를 사용하기 위해서는 import 키워드 사용
- static :
클래스의 속성과 메서드에 static 키워드를 사용하면 어디서나 속성과 메서드 공유 가능. 너무 많은 static의 사용은 시스템에 부하될 수 있음.
package com.java main;
import com.java.sample.Sample;
import com.java.sample1.Sample1;
public class MainClass {
public static void main(String[] args) {
Sample sample = new Sample();
Sample sample2 = new Sample2();
}
}
부모 클래스를 상속받은 자식 클래스는 부모 클래스의 속성과 기능도 이용할 수 있다.
기존의 검증된 클래스를 이용해서 빠르고 쉽게 새로운 class를 만들 수 있다.
extend 키워드를 이용해서 상속을 구현한다.
// ParentClass 파일
public Class ParentClass() {
public ParentFun() {
System.out.println("ParentClass");
}
}
// ChildClass 파일
public Class ChildClass extends ParentClass() {
public ChildFun() {
System.out.println("ChildClass");
}
// Test 실행 파일
public Class test () {
public static void main(String[] args) {
ChildClass childClass = new ChildClass();
childClass.ChildFun();
childClass.ParentFun();
}
}
// ChildClass
// ParentClass
메서드 오버라이드(override)
부모 클래스의 기능을 자식 클래스에서 재정의해서 사용한다.
기본자료형처럼 클래스도 자료형이다
모든 클래스의 최상위 클래스는 Object 클래스이다
상위 클래스를 호출할 때 super 키워드를 이용한다.
// ParentClass 파일
public class ParentClass {
int openYear = 1995;
public void make() {
System.out.println("ParentClass");
}
}
// ChildClass 파일
public class ChildClass extends ParentClass {
int openYear = 2000;
public void get() {
System.out.println("ChildClass");
System.out.println(this.openYear);
System.out.println(super.openYear);
}
}
// test 실행 파일
public class test {
public static void main(String[] args) {
ChildClass childClass = new ChildClass();
childClass.get();
}
}
클래스의 공통된 부분을 뽑아서 별도의 클래스(추상클래스)로 만들어 놓고 이것을 상속해서 사용한다.
abstact 클래스를 상속하기 위해서는 extends를 이용한다.
일반 메서드, abstract 메서드를 가질 수 있고 상속한 클래스에서 반드시 구현해야 한다.
인터페이스와 공통점 : 추상메서드를 가지고 객체 생성이 불가하며 자료형(타입)으로 사용된다.
인터페이스와 차이점 :
인터페이스는 상수, 추상메서드만 가진다. 추상 메서드를 구현만 하도록 하고 다형성을 지원한다.
추상클래스는 클래스가 가지는 모든 속성과 기능을 가진다. 추상 메서드 구현 및 상속의 기능을 가진다. 단일 상속만 지원한다.
// ArrayList 객체 생성
ArrayList<String> list = new ArrayList<String>();
// 데이터 추가
list.add("Hello");
list.add("World");
list.add(2, "Programming");
list.set(1, "C");
// 데이터 추출
String str = list.get(2);
// 데이터 제거
str = list.remove(2);
// 데이터 전체 제거
list.clear();
// 데이터 유무
boolean b = list.isEmpty();
// HashMap 객체 생성
HashMap<Integer, String> map = new HashMap<Integer, String>();
// 데이터 추가
map.put(5, "Hello");
map.put(6, "World");
// 데이터 교체
map.put(6, "C");
// 데이터 추출
str = map.get(5);
// 데이터 제거
map.remove(6);
// 특정 데이터 포함 유무
b = map.containsKey(5);
b = map.containsValue("World");
// 데이터 전체 제거
map.clear();
// 데이터 유무
b = map.isEmpty();
입/출력에 사용되는 기본 클래스는 InputStream과 OutputStream이 있다.
InputStream(FileInputStream, DataInputStream, BufferedInputStream)
OutputStream(FileOutputStream, DataOutputStream, BufferedOutputStream
파일에 데이터를 읽고/쓰기 위한 클래스로 read(), write() 메서드를 이용한다.
byte 별로 묶어서도 메서드 이용이 가능하다.
read(byte[]);
write(write(byte[], int off, int len);
// read()
InputStream inputStream = null;
inputStream = new FileInputStream("파일경로");
int data = 0;
data = inputStream.read();
// write()
OutputStream outputStream = null;
outputStream = new FileOutputStream("파일경로");
String data = "Hello World";
byte[] arr = data.getBytes();
outputStream.write(arr, 0, 5);