object |
|
|
|
Garbage collected Heap |
이를 대신하고 있다
class A{
A a = new A( );
// A : class name a : reference variable
new : keyword A( ) : constructor
// reference끼리의 연산(덧셈, 뺄셈 등)은 불가능하다.
Object-Oriented Programming Language (OOPL)의 3가지 특징
① Encapsulation
② Inheritance
③ polymorphism
⇒ 이 중 ② Inheritance 와 ③ polymorphism을 지원하지 않는 언어를
객체 기반 언어(Object Based Language)라고 함
ex) 자바 스크립트(xxJavascript)
Object와 class의 비교
Object |
class |
• instance of class (memory에 올라가는 부분) • Object is unique. |
• template for Object • source code (program text상에서 볼수 있다) |
• variable + method로 구성 ( = behavior= member method = function = action) |
• attribute + behavior로 구성 ( = variable = member variable = field = data = information ) |
∙ object 와 class의 설명 :
집을 지을 때 설계도가 필요하고 이를 통해 집을 한 채이상 지을 수 있는데 a,b,c라는 동네에 지을 때 모양은 같지만 장소가 다르다. class는 설계도로 이를 통해 각기 다른 주소에서 즉 메모리에서 구현할 때는 각기 다른 주소의 메모리에서 구현하는 object를 통해 가능하다. 클레스안에 접근에 대한 관계를 설정해 데이터를 핸들링할 수 있는 것까지 한 것이 자바언어이다.
Java language의 특성
① 쉬운 언어이다.
② 객체 지향적 언어이다.
③ 안전하다. (보안을 여러 단계로 한다.
포인터연산을 취소하여 메모리 누수현상을 막아주기 때문)
④ Interpreted 언어이다. ( 컴파일과 동시에 실행된다. interpreted되는 것을 자바 환경의 일종을 여긴다. 자바 버츄얼 머신에서 이해할 수 있는 바이트코드로 .class로 끝나는 구성을 가짐. )
⑤ platform independent (=Portable) ⇒ JVM 때문
( 포팅(작업환경이 바뀔 때마다 이를 다시 재 설정하는 과정)작업이 Java virtual machine에 의해 필요 없게됨. JVM은 각각의 플랫폼에 맞게 환경을 설정하여 준다. JVM은 소프트웨어적으로 에뮬레이터된 것으로 JVM이 되기 위한 백서는 밴더별로 서로 작성하여 준다. 우리의 경우 JDK안에 이러한 백서에 의해 JVM이 구현되어 있다. )
Garbage Collection (1-11)
( Garbage Collector )
c 언어 : malloc() c++ : new |
|
⇒ |
free 시켜주는 책임은 programmer에게 있음 |
⇒ |
java 환경에서는 garbage collector가 수행 |
| |||||
| |||||
c |
• 의미 : 쓰레기 청소기
GC라고도 불리기도 하는데 이는 Garbage Collector에 의해 구현되는데 c 언어에서는 메모리를 할당하고, 메모리를 제거할 때에는 프로그래머가 9이를 실행해야 하므로 자칫 메모리 낭비가 일어날 수 있는데,
자바에서는 java 환경에서 GC를 씀으로써 메모리를 할당후 자동적으로 삭제해줌
• object들이 만들어질 때 이들 각각은 reference count를 가지고 이것을 garbage collector heap에 만들어지는데 object는 reference count table에 레퍼런스 카운트가 생성될 때 구현된다.
오브젝트 카운트 테이블이 영값이 되는 것은 object와 garbage heap간의 연결이 완전히 끊어진 경우로서 이때 garbage collector에 의해 더이상 필요하지 않는 메모리를 free 상태로 만들어주는 상태를 말한다. 즉 쓰던 레퍼런스는 candidate (garbage collection되기 위해 임시지정, 마크)해 두었다가 일정 시간이 지난 후 소거해준다
⇒ reference가 더 이상 object를 가리키고 있지 않을 때(연결이 끊어질 때) mark만 해놓고 (candidate 되었다고 함) garbage collector가 나중에 한꺼번에 모아서 처리 (가능한 한 빨리)
• Garbage Collection
① 시점을 예측할 수가 없다.
(하지만 일정 시점에서 항상 순환하고 있다. 메모리가 부족하여 시스템이 다운되지
않도록 적절히 조절하여 준다.)
② 프로그래머가 강제로 시키는 것이 아니다.
(프로그래머가 garvage collector를 강제로 호출은 가능하지만 강제 시행은 되지 않고 오로지 JVM에 의해 자동적으로 일정시간에 실행된다. 왜냐면 이것이 JVM에 이미 구현되어 있기 때문이다. 메모리에 대한 뒷처리는 프로그래머가 아닌 자바환경의 하나인 garbage collector가 담당하여 처리한다.)
• Garbage Collection의 대상이 되는 경우
더이상 참조값을 사용할 수 없을 때
A a =new A():
A a= new A();
위에서 첫번째 값이 설정되었다가 다시 두번째 값이 정의되면 둘은 서로 다른
주소를 갖는 object로서 이전인 첫번째 값은 garbage collection의 대상이 되어
캔디데이터로 지정되어 나중에 garbage collector에 의해 소거된다.
• garbage collection은 Java의 performance가 떨어지는 하나의 이유가 된다.
Chapter 2 Identifiers, Keywords, and Types
◈ Identifier
: class name, variable, method name 등을 선언하는 데 사용되는 symbol
Comments(주석) (2-4)
① single line - //
② multi line - /* */
③ document comment - /** */
html code로 주석을 만들어 주는 주석을 말함.
Semicolons, Blocks, Whitespace (2-5)
• Semicolons(;) : 문장이 끝날 때,
;을 하지 않으면 컴파일러가 문장의 끝을 인식하지 못하여 에러발생
• braces {} : 블록이 끝날 때
• Whitespace : 문장을 깔끔하게 하기 위함 (공백을 마음대로)
Identifiers (2-8)
• 클래스이름, 변수이름, 메소드이름 등을 선언하는데 사용되는 symbol
ex) class A {
int i;
static void myMethod() {
• 반드시 첫문자는 A~Z, a~z, _, $ 와 같은 것으로 시작해야 한다.
• 숫자가 올 수는 있지만, 숫자로 시작할 수는 없다.
• keyword로 만들수는 없다. ( 단, 키워드를 포함할 수는 있다. )
ex) int this; // 잘못된 표현
int thisIntegerVariable; // 올바른 표현
• 길이의 제한은 없다.
◈ Keyword (2-10)
자바의 모든 keyword는 소문자이다.
◦ 시스템에서 일정특성을 가진 예약어로 등록된 언어를 keyword라고 한다.
• abstract : 추상화시킨다. 주로 class를 관리하고자 하는 목적으로 나왔다.
class와 method에만 붙임.
abstract class : 직접 객체를 생성 할 수 없다.
abstract method : 구현부를 가질 수 없다.
ex) abstract public void myMethod();
• Java에서는 goto 대신에 label, break, continue가 사용된다.
※ goto와 const 는 keyword에 등록은 되어 있지만
구현시켜놓지 않았다.
if( ) {
for(){
continue start; 또는 break start;
◦ start : 는 라벨이름으로 : 으로 표시해주어야 하며
루프문장에서 continue 문은 라벨명으로 점프하여 다시 시작하며,
break 문은 라벨명을 끝내라는 명이다.
• case : switch 문장과 쓰이는 것
case 0 : // case의 경우 반드시 space를 주어 구분을 해주어야
case 1 : // 에러가 발생하지 않는다.(keyword 와 identifier 사이에는 공백)
}
※ switch의 ( )안에는 integer type만 올 수 있다.( byte, short, char, int )
• catch : try 문과 같이 쓰인다.
try{
exception 이 발생할지도 모르는 코드
} catch(발생한 Exception type){
exception에 대한 처리
}
⇒ 위와 같은 코드를 protected code라고 부른다.
• char : 데이터 타입
• class : class를 만들때 사용되는 키워드
• default : switch ~ case 문장에서 case에 해당하지 않는 경우를 default로
지정하는 것
• double : 데이타타입
• extends : 상속에 관한 keyword
class name 밖에 올 수 없다.(interface는 안됨)
java.applet.Applet 과 같이 class full name도 올 수도 있지만
일반적으로 class name만을 쓴다.
• final : abstract와 반대의 개념
final로 선언된 class는 자기 밑에 더 이상 상속될 수 없게 만든다.
◦ final을 붙일 수 있는 것 : class, member variable, local variable, method
∙ final class : 상속시킬 수 있는 class를 만들 수 없다.
∙ final method : overriding을 금지
∙ final member variable :
∙ final local variable :
◦ java에는 constant라는 keyword가 없는 대신 final이 사용된다.
• finally : try ~ catch 문에서 사용되어 언제나 수행하도록 만듬
• implements : interface를 상속받을 때 쓴다.
• import : package가 달라지면 import를 선언해야한다.
∙ package 가 선언됐을 때 name space를 확장해주는 개념
∙ java에서 class들은 반드시 package 안에 포함이 되어져야 한다.
∙ package를 선언 안하면 컴파일러가 anonymous package를 제공한다.
⇒ class가 속한 directory를 하나의 package로 인식
∙ package는 directory information
※ class scope(영역)를 벗어나서 선언이 가능한 것들(순서대로)
① package
② import
③ class
• instanceof : 객체가 어떤 class type으로 만들어졌는지를 체크
• native : 플랫폼에 dependent한 언어를 사용하고자 할 때
• new : 새로운 메모리를 할당
• 접근지정자 : 접근에 대한 권한 설정
private , protected , public
• static : 객체를 생성하지 않고 사용하고자 할 때
• super : parent class의 객체를 가리킴
• this : 자신의 class의 객체를 가리킴
• synchronzied : thread에 관련, 동기화를 시킨다.
↔ volatile : 비동기화, default로 선언되기 때문에 거의 쓸 일이 없다.
• throw, throws : exception에 관련
• transient : I/O 관련
※ sizeof라는 키워드는 없다.
※ goto와 const는 키워드에 들어는 있지만 구현되어 있지는 않는다.
public class ContinueSt {
public static void main(String argsp[]) throws java.io.IOException {
int n, s, i;
for ( ; ; ) {
System.out.print("Enter a number = ");
n = System.in.read() - '0'; // 키보드로부터 입력받음, int로 받기 위해 0의 코드값을 빼준다.
if (n==0) break; // 0 입력시 무한 루프 탈출
else if (n<0) continue;
for (s=0, i = 1; i<=n; i++)
s += i;
System.out.println("n = " + n + " , sum = " + s);
}
}
}
data type (2-11)
Primitive type |
Reference type | ||
• language에서 제공하는 data type |
• class type으로 design된 것 compiler가 알지 못하는 user define data type을 정의 | ||
boolean |
true 또는 false |
| |
char |
0 ~ 216 -1 |
16bit | |
byte |
-27 ~ 27-1 |
8bit | |
short |
-215 ~ 215-1 |
16bit | |
int |
-231 ~ 231-1 |
32bit | |
long |
-263 ~ 263-1 |
64bit | |
float |
32bit | ||
double |
64bit |
cf) float : 소수점 7자리까지 가능
double : 소수점 15자리까지 가능
String : new라는 키워드를 사용하지 않고도 객체를 생성할 수 있는 것
String s=new String("hello")
s1=new String("hello")
String s2 ="hello"
String s3 ="hello"
new를 통해생성한 경우 주소가 서로 다른 곳에서 생성하지만, String을 통해 생성한 경우에는 같은 곳에 생성되게 된다.
즉 s ==s1 false
s2==s3 true
캐릭터의 배열과 스트링과는 전혀관계가 없다.
클래스 타입으로 디자인 된것
컴파일러가 알지 못하는 user define data type을 정의
자바에서 객체를 생성하는 방법은 위에서 언급한 것과 뉴밖에 없다.
시험포인트 : 캐릭터만이 영에서부터 값을 갖는 unsinged(부호값을 허용하지 않는 값)이다.
\t : A tab
'\u????' 16진법으로 고치는 것
class A{
int i ; //선언과 동시에 메모리 공간을 확보함.
//클레스레벨에서 선언하지 않아도 즉 i =7;이라고 생성시키지 않아도 일정한 default값으로 정한
값이 들어가게 된다.
A a; //reference타입의 경우 이때는 선언하는 경우, A의 주소가 들어갈 공간만 확보하는 경우.
a=new A(); //reference타입의 경우 이제서야 메모리공간을 확보하게 된다.
//선언만 하고 공간을 확보하지 못할 경우 컴파일은 되지만 이를 실행시키면
NullPointException이라고 하는 에러가 나옴
}
integral type에서 이진수인 7을 다른 진법으로 바꾸면
7
octalnumber = 07 팔진수이면 영을 붙이고 칠을 쓰면 되고
hexa number = 0x7 16진수이면 0x를 붙이고 숫자를 쓰면 된다.
2-17페이지에 값의 범위가 나옴 : integral type 자기비트수에서 1을 뺀값이 범위가 된다.
실수에서 자바는 default형태는 double로 인식한다.
플로트형 32bit과 롱형64bit이지만 실지 표현 크기는 플로트형이 더 크다 그이유는 실수의 크기이기 때문이다.
public class AssigmentSt{
public static void main(String [] args){
short s; int i ;
float f; double d;
s=526;
d=f=i=s;
System.out.print("s=" + s + "i=" + i);
System.out.println("f=" + f + "d= " + d);
}
}
결과치
s=526 i=526 f=526.0 d= 526.0
Process Exit...
java.lang안에 wrapper class라고 하여 그값을 알려주는 값이 있다.
float --------- Float
int ---------- Integer
char --------- Character
short --------- Short
boolean------- Boolean
long ---------- Long
byte ---------- Byte
아래의 예제에서 그값들에 대한 최대치와 최소치를 알고자 한다면 위에서 언급하는 메소드를 아래예제에 추가함으로써 class.lang안에 있는 wrapper class의 값을 알수 있다.
public class Primitives{
public static void main(String [] args){
boolean b;
int i =Integer.MAX_VALUE;
double d =Double.MIN_VALUE;
short s;
float f;
b=(i!=0);
System.out.print(" bloolean b= " + b);
System.out.println(" MAX_VALUE= " + i);
System.out.println(" MIN_VALUE= " + d);
}
}
결과치 :
bloolean b= true MAX_VALUE= 2147483647
MIN_VALUE= 4.9E-324
Process Exit...
coding convention
관례적으로 사용하였을때 코딩작업후 좀더 읽기쉬움을 추구하기 위해
클레스 : 첫글자 대문자이고 중간은 소문자로 가다가 중간에 다른 글자가 나오면 첫글자는 대문자
MyClass{}
메소드와 variable : 첫글자는 소문자로 시작하다 중간 다른 단어일때 첫글자는 대문자
myMethod()
constant상수 : 모두 대문자 구분은 _ 을 사용한다. MIN_VALUE
클래스와 인터페이스의 차이점
class A{}: 베리어불과 메소드를 가짐
하나의 상속부만 가짐. 벨리어블이나 메소드의 타입은 결정되어지는 것이 아니다.
interface B{} :
인터패이스에서의 상속은 implements c{}으로 된경우 implement된 안의 모든 method를 구현해야한다.
내가 implements받을 수 있는 것이 하나이상이 올수 있다. 다중 상속이 가능하다.
인터패이스라는 구조내에 들어간 모든 메소드는 abstract로 됨. variable은 final static으로 결정되어진다.
Terminology Recap
클래스 : 유저데이타타입을 디파인한 것으로 데이타타입으로 인용할수 있고 이클레스로 객체를 만들수 있다.
member : member method + member variable
Chapter 2 The end --------------------------------------------------------
Chapter 3 Expression and Flow Control
3-3페이지부터
local variable : 메소드 안에서 선언된 것들 (=automatic variable), 받드시 초기화가 필요하다.
초기화하지 않으면 컴파일시 에러값이 발생
member variable : class scope안에서 선언된것들, 초기화 시키지 않아도 영의 값으로 됨
배열에서의 초기화 선언과 같다. 페이지 3-6에 초기값이 나와있다.
static variable : 객체가 생성되기 이전에 생성.
nonstatic variable(instance variable) : 객체 생성과 관련이 있다. 객체생성된후 생성된 변수값.
예제 : 페이지 3-5
메쓰함수는 값을 불규칙적으로(임의로) 주어 실행하게 해주는 메소드로이고, 더불형을 인트형으로 형변환하여
변환하여 대입하여 한다.
public class SwichOne{
public static void main(String [] args){
ObjectOne one = new ObjectOne();
one.go();
}
}
class ObjectOne{
public void go(){
int max = 10;
int rand =(int)((Math.random()*max) + 1);
switch(rand){
case 1: System.out.print(" Bananas "); break;
case 2: System.out.print(" Oranges "); break;
case 3: System.out.print(" Pears ");
case 4: System.out.print(" Apples ");
case 5: System.out.print(" Plums "); break;
case 6: System.out.print(" pineapples "); break;
case 7: break;
default: System.out.println("NUT"); break;
}
}
}
구구단
class GuguTest04{
public static void main(String args[]){
int i =2;
int j= 1;
while(i<10){
while(j<10){
System.out.print( + (i * j) + "\t");
j++;
}
j=1;
i++;
System.out.println();
}
}
}
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
Process Exit...
띄어쓰기를 위해 이나 \t"를 사용하여야 한다.
Bitwise 형 연산자.
t & t ----t
배타적일때 투루값
오퍼랜딩처리방식이란 이값은 앞이 비록 폴스로 boolean처럼 빠져나갈 원인이 제공 되었더라도 빠져나가지 않고 뒤를 끝까지 계산한다.
integer값도 비티패턴으로 곧 이진수값으로 변환하여 계산
int i =5 int j =1 5--0100, 1---0001 i&j =1 i|j =5 i^j =4
Boolean 형 : Boolean형타입밖에 오지 못한다.
short-curcuit 방식 : 앞의것이 맞으면 뒤에것을 더이상 진행하지 않는 처리방식을 말한다.
T&&T -------답은 투루
F&&T-------답은 폴쓰로 앞의것이 폴스이므로 폴스이므로 뒤의 트루를 실행하지 않고 그냥 빠
져나오는 방식으로 이를 숏컷방식이라하낟.
|| 는 둘중 하나가 트루일경우 참..
String이란 클래스는 단지 read only기능을 가지기 때문에 String s="kanga"; s+="roo";라는 식에서 앞
의갚이 증가하면서 새로운 주소로 이동하기 때문에 캔디데이트에 의해 GC가 발생하게 된다.
shift operater : 총3가지 시험에 잘 나옴
integer type만 가능함.....
<< ←여기로 밀어내기
>> →이쪽으로 밀어내기 signed
>>> →이쪽으로 밀어내기 unsigned
1000~0000 사인드로 밀어낸경우 1111111111으로 전부밀어감
1이 음수값을 나타내는 데 이것에 영향을 받는다.
1000~0000 언사인드의 경우 0000000000000으로 밀어감
부호에 영향을 받지 않음
예)
int b1=1<<31;
b2=1<<31;
b1>>31;
b1=>>1;
b1 >>>31;
b2=>>>1:
b1
0000~0001
1000~0000
1111~1111
1111~1111
b2
0000~0001
1000~0000
0000~0001
0000~0000
1>>>32 1 을 32비트만큼 밀면 자기자신 값인 1로 돌아온다.
public class AssignmentOperators{
public static void main(String args []){
int x,y=2;
x=10; x+=y; System.out.print("1.x = " + x + ".");
x=10; x-=y; System.out.print("2.x = " + x + ".");
x=10; x*=y; System.out.print("3.x = " + x + ".");
x=10; x/=y; System.out.print("4.x = " + x + ".");
x=10; x%=y; System.out.print("5.x = " + x + ".");
x=10; x&=y; System.out.print("6.x = " + x + ".");
x=10; x|=y; System.out.print("7.x = " + x + ".");
x=10; x^=y; System.out.print("8.x = " + x + ".");
x=2; x<<=y; System.out.print("9.x = " + x + ".");
x=2; x>>=y; System.out.print("10.x = " + x + ".");
x=2; x>>>=32; System.out.print("11.x = " + x + ".");
}
}
결과값
1.x = 12.2.x = 8.3.x = 20.4.x = 5.5.x = 0.6.x = 2.7.x = 10.8.x = 8.9.x = 8.10.x = 0.11.x = 2.Process Exit...
public class ShiftOperators{
public static void main(String args []){
System.out.println("10<<2 = " + (10<<2));
System.out.println("10>>2 = " + (10>>2));
System.out.println("10>>>2 = " + (10>>>2));
System.out.println("-10>>>2 = " + (-10>>>2));
}
}
결과치
10<<2 = 40
10>>2 = 2
10>>>2 = 2
-10>>>2 = 1073741821
Process Exit...
Ternel operating system
자바에서 유일한 3항 연산자...
? a:b 앞의값이 트루면 a를 폴수면 b를 연산하는 연산자
public class ConditionalOperators{
public static void main(String args [])
throws java.io.IOException{
int a,b,c;
int m=0;
System.out.println("Enter three number = " );
a=System.in.read()-'0';
b=System.in.read()-'0';
c=System.in.read()-'0';
m= (a>b)? a:b; //a와 b중 큰 type으로 모두 캐스팅되어버린다.
m= (m>c)? m:c;
System.out.println("The largest number = " + m);
}
}
결과치
Enter three number =
14 15 16 17
The largest number = 4
Process Exit...
소문자를 대문자로 바꾸어주는 프로그램 : 소문자의 값이 더 작기 때문에 나오느 것
public class LowerToUpperConversion{
public static void main(String args [])
throws java.io.IOException{
char c;
int x;
System.out.println("Enter the lower char = " );
c=(char)System.in.read();
if(c>='a' && c<='z')
x=c +('A'-'a');
else x =c;
System.out.println("Upper char of " + c + "=" + (char)x);
System.out.println("Number " + c + "=" + (int)x);
}
}
결과치
Enter the lower char =
a
Upper char of a=A
Number of a=65
Process Exit...