728x90



1. 변수선언
 - 자바는 유형(type)을 철저하게 따진다.
 - 변수에는 크게 원시 변수(primitive variable), 객체레퍼런스(objectreference) 두 가지로 나눌 수 있다.
 - 변수에는 유형이 있어야 한다.
 - 변수에는 이름이 있어야 한다.
 - 뭔가를 담아두기 위한 용도로 쓰인다.


1) 원시 변수
 - 정수, 부울, 부동소수점 수와 같은 기초적인 값(단순한 비트 패턴으로 나타낼 수 있는 값)

유형

비트 수

범위

부울과 문자

boolean

 

true 또는 false

char

16비트

0~65535

정수

byte

8비트

-128~127

short

16비트

-32768~32767

int

32비트

-2147483648~2147483647

long

64비트

-아주 큰 값~아주 큰 값

부동소수점 소수

float

32비트

바뀔 수 있음

double

64비트

바뀔 수 있음

- 자바에서 변수를 선언 할 때는 유형을 지정 해야 한다.
ex) 커피전문점에 long, int, short, byte란 이름을 가진 컵들이 있다. 원시 변수로 주문을 한다고 하면 "int(유형) 하나만 주세요. 값은 2486(변수에 들어갈 값)으로 하고 변수 이름은 height(변수 이름)로 해 주세요"
- int 변수를 byte 변수에 대입하려고 하면 컴파일 되지 않는다. byte는 8비트의 변수이고, int는 32비트 변수 이다. 그러나 byte 변수를 int에 대입은 가능하다.
ex) int 컵을 byte 컵에 넣을 순 없다. 반대의 경우에는 가능. 이런 것을 암묵적인 확대(implicit widening)라고 한다.

변수명
- 반드시 알파벳 글자, 밑줄(_) 또는 달러 기호($)로 시작해야 한다. 숫자로 시작하면 안된다.
- 두 번째 문자부터는 숫자도 쓸 수 있다. 숫자로 시작하지 않으면 괜찮다.
- 위의 두가지 규칙을 지키고 자바 예약어만 사용하지 않는다면 어떤 이름이든지 마음대로 사용할 수 있다.

키워드
- 컴파일러에서 인식할 수 있는 키워드(keyword)를 비롯한 단어들이 바로 예약어(reserved word)이다.
- 원시 변수 유형도 예약어에 속한다.


2) 객체
- 객체 변수라는 것은 없다.
- 객체 레퍼런스 변수라는 것만 있다.
- 객체 레퍼런스에는 객체에 접근하는 방법을 알려주는 비트가 들어있다.
- 객체 레퍼런스에 객체 자체가 들어있는 것은 아니다. 포인터 같은 것이 들어 있다. 아니면 주소가 들어있다고 봐도 된다. 하지만 자바에서는 레퍼런스 변수 안에 무엇이 들어 있는지 알 수 없다. 그렇지만 그 안에 무엇이 들어있든지 상관없이 그 레퍼런스가 객체 단 하나를 가리킨다는 것은 확실하다. 그리고 JVM은 레퍼런스를 사용하여 객체를 다루는 방법을 알고 있다.
- 객체를 변수에 넣을 수 없다.
- 객체는 가비지 컬렉션 기능이 있는 에서만 산다.
- "점 앞에 것을 이용해서 점 뒤에 있는 것을 주세요"라고 이해
ex) myDog.bark();
     "myDog라는 변수로 참조할 수 있는 객체를 이용하여 bark() 메소드를 호출하라"를 의미
- 객체 레퍼런스는 단지 또 다른 변수 값에 불과하다.

객체 선언, 생성과 대입의 3단계
Dog myDog = new Dog()라는 구문에서
① 레퍼런스 변수 선언
Dog myDog
jvm에 레퍼런스 변수용 공간을 할당해 달라는 요청을 한 다음 그 변수명을 myDog로 지정한다. 이렇게 하면 myDog라는 레퍼런스 변수는 영원히 Dog 유형의 변수가 된다.
다른 유형의 레퍼런스 변수와는 절대 사용할 수 없다.
② 객체 생성
new Dog();
jvm으로 하여금 힙에 새로운  Dog 객체를 위한 공간을 마련하도록 지시한다.
③ 객체와 레퍼런스 연결
=
새로운 Dog 객체를 myDog라는 레퍼런스 변수에 대입한다.

힙( heap)이란?
원시 자료형이 아닌 보다 큰 크기의 데이터를 담고자 동적으로 할당하는 메모리 공간이다.
실행 시간에 크기가 결정되는 동적 배열 및 리스트와 같은 경우 힙을 사용하는 것이 보다 공간을 효율적으로 활용할 수 있다.
c언어와 같은 경우 사용한 공간을 명시적으로 반환해 주어야 하므로 이 과정을 빠뜨림으로서 메모리 누수와 같은 버그의 원이이 되기도 한다.
* 자세한 내용은 아래 사이트들 참고
http://ko.wikipedia.org/wiki/%ED%9E%99_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29 (프로그래밍에서의 힙)
http://ko.wikipedia.org/wiki/%ED%9E%99_%28%EC%9E%90%EB%A3%8C_%EA%B5%AC%EC%A1%B0%29 (자료구조에서의 힙)
http://blog.naver.com/jkb8245/17627649

final인 경우 Dog 객체 하나가 대입되었다면 바로 그 Dog 객체가 아닌 다른 Dog 객체를 참조 할 수 없다.
Dog 객체 하나를 참조하다가 다른 Dog 객체를 참조하는 것도 가능하고, null 값이 있을 수도 있다.

가비지 컬렉션 기능이 있는 힙에서의 삶
Book b = new Book();
Book c = new Book();
--> Book 레퍼런스 두 개를 선언. Book 객체 두 개를 생성. 생성한 Book 객체를 레퍼런스 변수에 대입. Book 객체 두 개는 힙에서 살고 있다.
레퍼런스 2개, 객체 2개

Book d = c;
--> 새로운 Book 레퍼런스 변수를 선언. 세번째 Book 객체를 새로 생성하는 대신 c라는 변수에 들어있는 값을 d라는 변수에 대입.
'c에 들어 있는 비트들을 꺼내서 복사한 다음 그 복사본을 d에 집어 넣어라'로 이해
c와 d는 똑같은 객체를 참조
c와 d 변수에는 같은 값의 서로 다른 복사본 두 개가 들어 있다.
레퍼런스 3개, 객체 2개

c = b;
--> 변수 b의 값을 변수 c에 대입.
'b에 들어 있는 비트들을 복사해서 새로운 복사본을 c변수에 넣어라'로 이해
b와 c는 모두 같은 객체를 참조
레퍼런스 3개, 객체 2개


힙에서의 삶과 죽음
Book b = new Book();
Book c = new Book();
--> Book 레퍼런스 변수 두 개를 선언. Book 객체 두 개를 새로 생성합니다. 그리고 Book 객체를 레퍼런스에 대입. Book 객체 두 개가 힙에서 살게 됨.
활성 레퍼런스 2개, 접근 할 수 있는 객체 2개

b = c;
--> c의 값을 b에 대입. c에 들어있는 비트를 복사한 다음 새로운 복사본을 b 변수에 집어 넣는다. 이제 두 변수는 똑같은 값이 들어 있다.
b와 c는 모두 같은 객체를 참조. 1번 객체는 버림 받았기 때문에 가비지 컬렉션(GC, Garbage Collection) 대상.
활성 레퍼런스 2개, 접근할 수 있는 객체 1개, 버림받은 객체 1개
처음 b로 참조했던 1번 객체는 더 이상 아무 레퍼런스도 남아 있지 않음. 따라서 접근 할 수 없다.

c = null;
c 변수에 null 값을 대입. c가 null레퍼런스가 됨. 어떤 것도 참조하지 않음. c는 여전히 레퍼런스 변수고 나중에 대란 Book 객체를 c에 대입할 수 있다.
2번 객체에는 여전히 활성 레퍼런스(b)가 있고, 활성 레퍼런스가 있는 한 GC 대상이 되지 않음.
활성 레퍼런스 1개, null 레퍼런스 1개, 접근할 수 있는 객체 1개, 버림받은 객체 1개


* 객체는 가비지 컬렉션 기능이 있는 힙 안에서 삶


배열은 찬장의 컵과 같다.
배열도 객체이다.
- 자바 표준 라이브러리에는 맵(map), 트리(tree), 집합(set)을 비롯한 여러가지 복잡한 자료 구조(data structure)가 있다. 하지만 사물의 순서가 있는, 그리고 효율적인 목록을 빠르게 만들 때 배열을 쓰는 것이 좋다.
- 배열을 사용하면 인덱스 위치를 써서 배열에 있는 임의 원소를 사용할 수 있기 때문에 올바른 임의 접근이 가능
- 배열의 모든 원소는 그냥 변수
- 배열은 원시 변수의 배열이든 객체 레퍼런스의 배열이든 상관없이 항상 배열이다.


Dog 배열을 만들어 봅시다.

Dog [] pets;
--> Dog 배열 변수를 선언

pets = new Dog[7]
--> 길이가 7인 Dog 배열을 만들어서 앞서 선언한 Dog[] 변수인 pets에 대입

pets[0] = new Dog();
pets[1] = new Dog();
--> 새로운 Dog 객체를 생성하고 그 객체를 배열 원소에 대입. Dog 배열에 들어있는 원소는 Dog 레퍼런스 변수에 불과하다는 점. Dog 객체는 따로 만들어야 한다!!


Dog를 레퍼런스 변수를 사용하여 제어
Dog fido = new Dog();
fido.name = "Fido";
fido.bark();
fido.chaseCat();

Dog를 배열에 있는 경우
Dog [] myDogs = new Dog[3];
myDog[0] = new Dog();
myDog[0],name = "Fido";
myDog[0].bark();


728x90
728x90




객체지향 프로그램에서 좋은 점
 - 유연성, 확장성이 좋다.
   (테스트를 끝낸 코드는 다시 건드리지 않아도 된다는 점)

상위 클래스 : 추상적
하위 클래스 : 구체적

오버라이드(override) : 하위클래스에서 메소드의 역할을 변경하거나 확장할 필요가 있을 때 상속받은 메소드를 새로 정의 하는 것

객체 구성 요소
1) 객체에서 자신에 대해 아는 것 = 인스턴스 변수 = 상태(데이터)
 - 인스턴스(instance)란 객체(object)를 부르는 다른 이름이라고 생각
2) 객체에서 자신이 하는 것 = 메소드 = 행동

Class Movie {
  String title;
  String genre;

  void playIt()
  {
    System.out.println("영화를 상영합니다");
  }
}
위에 Movie 클래스에서 title, genre는 인스턴스 변수이고, playIt()은 메소드 이다.

클래스와 객체 사이의 차이점
1) 클래스는 객체가 아니다. 객체를 만들기 위한 용도로 쓰여진다.
- 가상머신에 그 유형의 객체를 만드는 방법을 알려주는 역할
- 클래스로 만들어진 객체는 클래스의 인스턴스 변수용으로 쓰기 위한 변수를 가질 수 있다.

main 메소드의 두 가지 용도
- 클래스를 테스트 하기 위한 용도
- 자바 애플리케이션을 시작하기 위한 용도
* 자바 애플리케이션이란 객체가 다른 개체와 대화하는 것에 불과하다.

자바는 청소도 알아서 한다.
1) 자바 객체가 생성되면 힙(Heap)이라는 메모리 공간에 저장
- 모든 객체는 언제, 어디서, 어떻게 만들어졌든 상관없이 힙에서 산다.
2) 자바의 힙은 가비지 컬렉션 기능이 있다.
- JVM에서 어떤 객체가 절대로 다시 쓰이지 않을 것이라는 결론을 내릴 수 있으면 그 객체는 가비지 컬렉션 대상이 된다.
- 메모리가 모자라게 되면 가비지 컬렉터가 작동함변서 더 이상 사용할 수 없는 객체를 치워버려 재활용할 수 있는 메모리 공간을 확보한다.




728x90
728x90



1. 자바는 어떤 식으로 돌아갈까요?
소스 - 컴파일러 - 결과물(코드) - 가상머신

1) 소스
- 개발자가 소스 작성.
2) 컴파일러
- 소스를 컴파일러로 처리.
3) 결과물(코드)
- 컴파일러에서 자바 바이트코드를 만듬.
- 자바를 돌릴 수 있는 모든 장치에서 이 파일을 뭔가 실행시킬 수 있는 형태로 해석.
- 컴파일 바이트코드는 플랫폼에 무관하게 사용.
4) 가상머신
- 자바 가상 머신으로 바이트 코드를 실행


컴파일러란?
고수준의 언어를 저수준의 언어로 옮기는 것. 
원시코드를 목적코드로 옮기는 과정 컴파일이라 한다.
프로그램의 오류를 확인 하고, 제대로 만들어진 경우에만 최종 결과를 만들어 줌.
* 자세한 내용은 위키백과 참고
: http://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC

자바 바이트코드(bytecode)란?
자바 가상 머신이 실행하는 명령어 형태.
플랫폼에 독립적임.
기계어가 아닌 중간단계의 바이트코드 형태로 변환되는 관계로, 역컴파일러 혹은 디컴파일러라고 불리는 실행코드를 역으로 추적하는 프로그램에 취약.
* 자세한 내용은 위키백과 참고
: http://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C

자바가상머신(JVM:Java Virtual Machine)이란?
자바 바이트 코드를 실행하는 주체.
모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행.
스택 기반.
가베지 컬렉션 사용.
* 자세한 내용은 위키백과 참고
http://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0



2. 자바의 역사
자바 1.02 - 자바 1.1 - 자바 2(버전 1.2 ~ 1.4 이후) - 자바 5.0(버전 1.5 이상)

1) 자바 1.02
- 클래스 개수 250개
- 느림
- 애플릿을 만들기 위한 용도로 많이 쓰임
2) 자바 1.1
- 클래스 개수 500개
- 약간 빠름.
- GUI 코드 향상.
- 많이 사용되기 시작.
3) 자바 2
- 클래수 개수 2300개
- 훨씬 빠름
- 네이티브 고유 코드와 거의 같은 속도로 실행 되는 경우도 있음
- J2ME, J2SE, J2EE의 세종류로 분리
- 엔터프라이즈 및 모바일 애플리케이션의 주력 언어
4) 자바 5.0
- 클래수 개수 : 3500개
- 개발하기 편해짐
- 다른 언어에서 많이 쓰이던 새로운 기능 추가


애플릿이란?
컴퓨터 프로그램과 달리 독립적으로 실행 될 수 없음.
애플릿의 예로 자바 애플릿, 플래시 동영상 등.
* 자세한 내용은 위키백과 참고
http://ko.wikipedia.org/wiki/%EC%95%A0%ED%94%8C%EB%A6%BF

네이티브 코드(native code)란?
프로세서별 기계어 코드로 컴파일된 코드입니다.
CLR을 통해 컴파일된 실행가능한(.EXE)코드 를 말한다.

J2ME(Java 2 Micro Edition)란?
모바일 기기나 휴대기기 등 소형장비에 사용.
* 자세한 내용은 java.com 참고
http://www.java.com/ko/download/faq/whatis_j2me.xml

J2SE(Java 2 Standard Edition)란?
기본적 자바 개발, 실행 환경
로컬프로그램, 클라이언트 프로그램에 주로 사용.

J2EE(Java 2 Enterprise Edition)란?
서버의 위치에서 많이 사용

* J2ME, J2SE, J2EE 자세한 내용은 블로그 참고
http://secrys.tistory.com/entry/J2SE-J2EE-J2ME-%EB%9E%80



3. 자바 코드의 구조
소스파일 - 클래스 - 메소드 - 선언문
소스 파일 안에는 클래스가 들어가고, 클래스에는 메소드가 들어가고, 메소드에는 선언문이 들어간다.

JVM에서는 main 메소드의 중괄호 안의 있는 것을 모두 실행시킴
모든 자바 애플리케이션에는 최소한 크랫스 한 개가 있어야 하며 적어도 main 메소드 하나가 있어야 함.(클래스마다 하나씩이 아니고 애플리케이션마다 하나씩)
프로그램을 실행 시킨다는 것은 사실 클래스를 실행 시키는 것.
프로그램 실행을 위해서는 반드시 main() 메소드가 필요.



4. 자바 구문

자바에는 while, do-while, for의 세 가지 표준 순환 구조.

대입 연산자는 등호 한 개로 구성, 동치 연산자는 등호 두 개로 구성

system.out.print는 같은 행에 계속 출력
system.out.println은 줄 바꿈 println은 printnewline의 약자

728x90
728x90
728x90
728x90
728x90

+ Recent posts