자바는 굉장히 대표적인 객체지향 프로그래밍언어 중 하나입니다. 자바 최초개발자는 '자바의 아버지'라고 불리우는 제임스 아서 고슬링이며, 국적은 캐나다로, 아마존 웹 서비스, 오라클, 구글, 썬 마이크로시스템즈 등에서 근무했다고 합니다. 자바 커피를 하루에 10잔 이상 마시는 자바 커피 덕후여서, 자바(Java)라는 명칭은 인도네시아 자바섬에서 유래되었다고 합니다.
자바는 객체 지향 프로그래밍(Object Oriented Programming)입니다.
객체지향프로그래밍의 대표적 특징에는 상속,캡슐화(은닉),다형성,추상화가 있습니다.
OOP는 4가지 특징을 활용해 코드의 재사용성을 증가하고 유지보수를 용이하게 만듭니다.
class People{
//필드(Feild)
String name; //이름
int age; //나이
//메소드(Method)
public void printMyself(){
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
}
class Student extends People{
//필드(Field)
int korean_scroe; //국어성적
int math_score; //수학성적
int english_score; //영어성적
//생성자(Constrouct)
Student(String name, int age, int kor_score, int mat_score, int eng_score){
super.name = name; //부모 필드
super.age = age; //부모 필드
this.korean_scroe = kor_score;
this.math_score = mat_score;
this.english_score = eng_score;
}
//메소드(Method)
public void printScore() {
System.out.println("국어성적 : " + korean_scroe);
System.out.println("수학성적 : " + math_score);
System.out.println("영어성적 : " + english_score);
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student("홍길동", 18, 100, 90, 80);
student.printMyself(); //부모 메소드 호출
student.printScore(); //자식 메소드 호출
}
}
캡슐화 (Encapsulation, Information Hiding)
캡슐화란 객체의 내부 구조 및 데이터를 캡슐처럼 감싸 외부에서 직접 볼 수 없게 은닉하여 보호하는 것을 말합니다.
하지만 객체들끼리의 상호작용을 위해서는 일정부분이 외부에 공개되어야 데이터를 주고 받을 수 있습니다.
이를 위해서 클래스와 멤버변수(필드), 멤버함수(메소드)는 외부에서 접근가능한 범위를 지정할 수 있는 접근제어자와 함께 사용됩니다.
public class Person {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age >= 0) {
this.age = age;
}
}
}
public class HelloWorld {
public static void main(String[] args) {
Person p1 = new Person();
p1.setAge(20);
System.out.println(p1.getAge() + "살 입니다.");
}
}
다형성(Polymorphism)
class Animal {
public void move() {
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal {
public void move() {
System.out.println("사람이 두 발로 걷습니다.");
}
public void readBook() {
System.out.println("사람이 책을 읽습니다.");
}
}
class Tiger extends Animal {
public void move() {
System.out.println("호랑이가 네 발로 뜁니다.");
}
public void Hunting() {
System.out.println("호랑이가 사냥을 합니다.");
}
}
class Eagle extends Animal {
public void move() {
System.out.println("독수리가 하늘을 납니다.");
}
public void flying() {
System.out.println("독수리가 날고 있습니다.");
}
}
class Bear extends Animal {
public void move() {
System.out.println("곰이 이동합니다.");
}
public void biting() {
System.out.println("곰이 베어뭅니다.");
}
}
public class AnimalTest {
public static void main(String[] args) {
AnimalTest test = new AnimalTest();
test.moveAnimal(new Human());
test.moveAnimal(new Tiger());
test.moveAnimal(new Eagle());
test.moveAnimal(new Bear());
Animal[] animalList = new Animal[4];
animalList[0] = new Human();
ArrayList<Animal> animals = new ArrayList<Animal>();
}
public void moveAnimal(Animal animal) {
animal.move();
if (animal instanceof Human) {
Human human = (Human)animal;
human.readBook();
} else if (animal instanceof Tiger)
Tiger tiger = (Tiger)animal;
tiger.Hunting();
} else if (animal instanceof Eagle) {
Eagle eagle = (Eagle)animal;
eagle.flying();
} else if (animal instanceof Bear) {
Bear bear = (Bear)animal;
bear.biting();
} else {
System.out.println("지원되지 않는 기능입니다.");
}
}
}
JAVA 8부터는 인터페이스 안에 default 선언을 하면 바디가 있는 메서드도 선언이 가능합니다.
자바에서는 JVM이 지속적으로 메모리를 감시하면서 더이상 사용되지 않는 메모리를 해제시켜 줍니다.
C/C++ 등 다른 언어의 경우 더이상 사용하지 않는 메모리는 재사용 가능하게 해제해야 합니다. 이는 개발자가 직접 메모리를 해제해야 함을 의미합니다. 그러나 자바는 Garbage Collection을 통해 메모리 관리를 자동으로 수행되기 때문에 개발자가 신경 쓸 필요가 없습니다. 만약 개발자가 직접 메모리를 해제하고 싶은 경우, System.gc();로 Garbage Collector를 호출하여 해제할 수 있습니다.
자바는 운영체제에 독립적입니다. 이것은 무슨의미일까요?
자바의 개발 환경과 배포환경이 다를 경우, 프로그램을 다시 컴파일 할 필요 없이 실행가능함을 의미합니다. 이는 자바가 Java Virtual Machine 위에서 돌아가기 때문입니다. Java Virtual Machine에서 별도의 Java Compiler를 통해 사용자의 코드를 Byte 코드로 변환합니다. 따라서 모든 자바 프로그램은 이론적으로 CPU나 운영체제의 종류와 무관하게 동일하게 동작합니다. 아래는 Java Virtual Machine 구조입니다.
자바는 하나의 프로그램에서 여러 개의 쓰레드가 동시에 실행할 수 있는 환경을 지원합니다. C/C++은 운영체제의 도움을 받아 멀티 쓰레드를 수행하지만, 자바는 운영체제 지원없이 멀티스레드 프로그래밍이 가능합니다.
멀티스레드란? 여러 스레드(프로그램의 실행단위, 프로세스 내 주소공간 및 자원 공유함)를 동시에 실행시키는 응용프로그램을 작성하는 기법입니다. 장점은 프로세스 내 메모리 공유를 통해 시스템 자원 소모가 줄어든다는 점이지만, 반면에 자원을 공유하기 때문에 충돌이 일어날 수 있습니다.
자바는 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩하여 생성합니다.
동적로딩(Dynamic Loading)은 클래스 일부 변경 시 다시 컴파일하지 않아도 되는 이점이 있습니다.또한, 비교적 적은 작업으로 처리할 수 있는 유연성을 동적로딩이 제공합니다. 반면에 그때 그때 메모리에서 불러오기 때문에 프로그램 실행 속도가 정적로딩에 비해 느립니다. (느린 속도를 해결하기 위해 static 키워드를 사용합니다)
정적 로딩은 프로그램 실행 시 모든 실행파일이 메모리에 적재되어 실행되는 로딩방법입니다. 대표적으로 C언어가 있습니다. 정적로딩은 모든 파일이 메모리에 적재되어 메모리를 많이 차지하지만, 빠르게 가져와 사용할 수 있다는 장단점이 있습니다.
참고
[JAVA] 자바 언어의 특징 5가지
객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화
객체지향이란?