프로그래밍 기법

-compile 기법(통 번역후 실행)

-interpret 기법(바로바로 번역해서 실행, 실행파일을 만들지 않는다.)

-Hybrid 기법(중간코드 사용)


객체지향언어(Object Oriented Language)란?

-클래스, 상속(상위개념의 정의를 따름), 캡슐화(incapsulation), 다형성 등 객체지향의 개념이 잘 적용된 언어

-예전에는 동사의 개념, 객체지향은 명사의 개념, 명사의 성향을 반영하여 실행

(객체지향은 프로그램 규모가 커질 시 유지보수가 쉽다. 하지만 같은 수준(level)의 프로그래머라면 객체지향이 아닌게 훨씬 프로그램의 속도가 빠르나, 하드웨어의 발전으로 그리 큰 차이가 아니므로 객체지향의 사용 추세가 늘고 있다.)


자바언어의 특징

-운영체제에 독립적이다. 윈도든 리눅스든 가능

-JVM을 사용하여 한번 작성된 프로그램은 어떠한 운영체제에서도 실행이 가능

-자바의 모든 개발환경은 open source


자바 프로그램은 사용 형태에 따라 구분

-자바 응용 프로그램:일반 응용 프로그램

-자바 애플릿:웹 검색기 상에서 작동하는 프로그램

-자바 서블릿:웹 환경에서 실행되는 자바 프로그램

-JSP(Java Server Page):서블릿과 비슷하나 HTML 속에 자바 코드를 삽입하여 사용

-Java Beans:자바로 작성된 프로그램(컴포넌트)을 부품처럼 사용하여 프로그래밍 하는 방법


자바 프로그램 실행방법

-운영체제(32bit, 64bit에 맞는 JDK(Java Development Kit)를 받아 설치한다.

-IDE(Integrated Development Environment)로서 이클립스 같은 것을 받아 설치한다.(운영체제에 맞는)


이클립스의 기본 구조

-window->show view에서 뷰 선택가능, 위치이동 가능

-view의 종류

package explorer(프로젝트 중심으로 자바 패키지와 클래스 관리), 

Navigator(package explorer와 비슷하나 실제 디렉터리의 구조를 보여주는 것), 

Outline(편집기에서 편집 중인 프로그램의 트리구조를 보여주는 뷰), 

Console(자바 프로그램에서 출력되는 메시지를 보여주는 뷰), 

Problems(소스에 문제가 있는 부분을 목록으로 보여주는 뷰), 

Javadoc(자바 API문서를 보여주는 뷰이다. 자바 소스가 포함되어 있다면 사용하는 클래스 라이브러리의 설명 문서를 참조할 수 있음)


이클립스의 프로그램 작성 순서

-file->new->project-> 프로젝트명 입력

-file->new->class-> class명 입력, public static void main을 항상 선택하기

-프로그램 실행시 매개변수가 없는 경우 run->run

-프로그램 실행시 매개변수가 있는 경우 run->run configurations을 이용


프로그래밍 오류의 종류

-구분(syntax)오류, compiler가 번역할 때 오류를 잡아줌

(타이핑 오류, 예약어의 잘못 사용, 닫는 괄호 생략, 구분 종료 기호(;) 생략, 구문 구조 오류 등)

-실행시간(runtime)오류, 말은 맞는데 0으로 나누라거나 등의 불가능한 것을 지시할 때, compiler가 잡아줌

(0으로 나누는 것, 배열의 첨자 범위를 벗어난 접근, 실행시 입력받은 데이터의 오류 등)

-논리(logic)오류, 애초에 프로그램 작성한 사람이 논리적인 오류를 범함, 즉 algorithm이 틀린 것


몇가지 용어들

식별자, 예약어, 클래스, 멤버변수, 변수, 상수, 자료형, 생성자, 메소드, 


식별자(identifier, 변수, 상수, 메소드, 배열, 문자열, 사용자가 정의하는 클래스나 메소드 등을 구분할 수 있는 "이름"을 의미)

식별자의 사용 원칙

문자, 숫자, 특수문자(_,$)가능

첫문자는 숫자가 불가능

예약어를 식별자로 불가능

true,false,null은 식별자로 불가능

길이제한없음

대소문자 구분함

식별자 사용의 관례

클래스 이름은 첫문자를 대문자로하고 space를 사용하지 않고 명사구는 붙여서 짓되 각 명사의 첫문자 대문자(ex:JavaTest1)

메소드, 변수, 배열, 문자열의 이름, 모두 붙여서, 명사의 첫문자는 대문자, 단 가장 첫문자는 소문자(ex:nameAddress)

상수, 모두 대문자로 사용, 만약 space처럼 띄운 느낌이 필요하면 _를 사용한다.(ex:MAX_NUMBER)


예약어(Reserved word)

미리 정해진 함수같은 것들이다.


코드내에 주석문 넣는 방법

// 주석문 : // 표시부터 그 줄의 끝까지 위치한 모든 문자를 주석으로 간주한다.

/* 주석문 */ : 줄 수와 상관없이 “/*” 시작과 “*/” 끝 사이에 있는 모든 문자를 주석으로 간주한다. 여러 줄의 주석이 가능하므로 긴 설명을 하거나 많은 양의 소스를 주석으로 처리하고 싶을 때 이용한다.

/** 주석문 */ : 줄 수와 상관없이 “/**” 시작과 “*/” 끝 사이에 있는 모든 문자를 주석으로 간주한다. 클래스의 선언부, 멤버, 생성자 등 클래스 인터페이스 시작 부분에 사용해야 한다. 이 주석은 소스를 라이브러리로 만들 때 공식 문서용으로 뽑아 사용할 수 있다. javadoc 시스템을 사용하여 API 문서나 도움말 등에 이용된다.


자료형(Data type)(주의:Java에서는 String은 자료형이 아니라 클래스이다.)

기본자료형(primitive type)

-정수형:byte(8비트), short(16비트), int(32비트), long(64비트)

-최상위비트(most significant bit, 줄여서 MSB)를 부호결정비트로 사용한다(0은+, 1은 -)

-묵시적인 정수형은 모두 int형

-연산 후 주어진 할당된 비트수보다 큰 값이 되면 오바된 앞자리들을 버린다.

-2의 보수법을 따른다.

장점:

-MSB가 0/1 = 양/음 성질 유지

-음수를 더하는 방식으로 뺄셈을 할 수 있다.

-음수의 비교연산에서 발생하는 모순이 해결된다.

-0이 두개나 존재하는 모순이 해결된다(1의 보수법 사용시 문제점)

-덧셈과 뺄셈을 구현할 때 캐리(가용비트수보다 한자리 커지는 현상)를 처리하지 않아도 된다.(1의 보수법 사용시 문제점)

 (1의 보수에서는 캐리발생시 LSB에 +1해줘서 해결한다. 이러면 매 계산마다 캐리가 발생하는지도 체크해야되서 효율성 떨어짐)

ex:

01000100=68

68의 덧셈 역원을 얻기 위해 0<->1을 바꿔서 10111011을 얻은 다음에 00000001을 더한다. 

10111100이 나오고 이것이 (-68)이다. (10111100을 MSB가 1이니 -, 나머지 1들을 2^n의 계수로보고 십진수로 바꾸면 -60이 나오는데 2의 보수법이란 이것을 -60이 아닌 -68로 보자고 약속하는 개념이다.)

-실수형:float(32비트), double(64비트)

-float의 MSB는 부호, 이후 8비트는 지수부분(exponent part), 나머지는 가수부분(mantissa, 23비트)

-double의 MSB는 부호, 이후 11비트는 지수부분(exponent part), 나머지는 가수부분(mantissa, 52비트)

-논리형:boolean(1비트로 가능해보이지만, 8비트에 할당함, 그 이유는 컴퓨터에서 꺼낼 수 있는 주소 단위가 8비트=1바이트 이므로)

-문자형:char(16비트의 유니코드로 문자를 나타냄, 원래는 1바이트로 나타냈으나, 각 나라의 언어가 많아짐에 따라 2바이트됨)

ex: 가:AC00, 각:AC01, A:0041, C:0042

ex: '1' + 10하면 59가 나온다.('1'은 char이고 char+int하면 char가 ascii코드로 바껴서 계산됨)

ex: "1"+ 10하면 110이 나온다.("1"은 string type이고 string+int하면 int를 string type로 바껴서 string의 나열이 출력된다.)

-특수문자 표현 방법

backspace는 \b

tab은 \t

linefeed(줄바꿈)는 \n

formfeed(커서 앞으로 이동)는 \f

carriage return은 \r

backslash는 \\

single quote는 \'

double quote는 \"

-형변환(casting)

int a = 259;          //a = 259

byte b = (byte) a;  //b = 3

위와 같이 길이가 더 긴 것을 짧은 자료형으로 바꾸거나, 짧은 자료형을 긴 자료형으로 바꾸기 위해 (byte) 등을 추가하여 할 수 있다. 이를 casting이라 한다.

더 긴 것을 짧은 것으로 casting할 때는 하위 비트만을 할당한다. 반대로도 짧은 것을 긴 것에 할당 시 긴 것의 하위 비트에 할당시킨다.

참조자료형(reference type)

-기본 자료형(primitive type)의 경우는 지정된 위치에 값이 저장되어 있는 반면, 참조 자료형(reference type)은 지정된 위치에 실제 값이 있는 곳의 주소가 저장된다. 따라서 실제의 어떤 값을 가져올 때는 두번의 접근이 필요하므로 기본 자료형에 비해 효율성이 떨어질 수 있다.

Ex)Integer b = new Integer(10); //Integer라는 class의 새로운 b라는 색체를 만든 것

변수(variable)과 상수(constant)

값이 저장된 main memory의 "위치"에 주어진 이름이다. CPU의 register로 보내는 역할을 하며, 자료형도 지정해줘야 한다. 자료형만 사용자가 지정하면 memory위치나 length등은 자동으로 설정된다.

값이 저장된 main memory의 위치이지만 그 값이 일정하게 지정한 것이 상수


연산자(operator)

단항

++a:a값을 계산하고 a를 1증가

a++:a값을 1증가하고 계산

이항

a/b:몫

a%b:나머지

삼항

ratio = count > 0 && count <= 100 ? count/100 : 0;// count란 변수값이 0초과에 100이하면 ratio에 count/100을 넣고 아니면 0을 넣어라.

관계연산자(>,>=,<,<=,==,!=, instanceof)

객체 instanceof 클래스, 객체가 클래스인지 확인하는 연산자

ex:

class A{}

class B extends A{}

class instanceofEx01 {


public static void main(String[] args) { 

  A a = new A();

  B b = new B();

  System.out.println("a instanceof A : " + (a instanceof A));

  System.out.println("b instanceof A : " + (b instanceof A));

  System.out.println("a instanceof B : " + (a instanceof B));

  System.out.println("b instanceof B : " + (b instanceof B)); 

  }

}


<결과>

a instanceof A : true

b instanceof A : true

a instanceof B : false

b instanceof B : true

논리연산자(&&, ||, !)

x&&y:x와 y가 모두 true일 때 true를 반환

x||y:x가 true이면 true를 반환, x가 false이면 y를 평가하고 y가 ture이면 true를 반환, x와 y모두 false이면 false를 반환(x가 true이면 y를 평가안한다는 점 주의)

!x:x의 negation

비트연산자(비트 단위로 연산할 수 있는 연산자, 정수형의 데이터에만 적용이 가능하다)

op1 >> op2 : op1을 오른쪽으로 시프트(shift)

op1 << op2 : op1을 왼쪽으로 shift

op1 >>> op2 : op1을 op2만큼 오른쪽으로 shift하면서 왼쪽에는 항상 부호에 무관하게 0이 채워짐

op1 & op2 : 비트 단위의 논리곱(&) ex)1&1=1, 1&0=0

op1 | op2 : 비트 단위의 논리합(|) ex)1|1=1

op1 ^ op2 : 비트 단위의 XOR ex)1^1=0, 1^0=1, 0^0=0

~op : 비트 단위의 보수

쉬프트연산자

비트 단위로 이동하는 연산자

정수형에만 사용 가능

정수에 해당하는 비트 값을 좌, 우로 이동시키면 곱셈 또는 나눗셈의 결과를 얻을 수 있다.

산술적 쉬프트

숫자 << 자릿수 : 숫자*(2*자릿수), 

ex) 4 << 1 = 8 //4의 뒷부분은 0으로 채워짐

ex) 010 << 1 = 16 // 010은 8진법으로 봐서 8로본다. 따라서  16이 나온다(octal)

ex) 16 >> 1 = 8 // 가장 앞 부호비트는 그대로두고 0이 추가됨

ex) -16 >> 1 = -8 //

ex) -16 >>> 28 = 15 // int 16의 비트표현인 000...10000, 2의 보수법에 따라 111...01111이고 이것을 오른쪽으로 28칸 옮겼으므로 000...0001111, 이렇게 3개쓰면 반드시 왼쪽에 0으로만 채워짐(원래 음수였더라도)

배정 연산자

i=8+2; // CPU의 register에서 8+2 계산한 값이 저장되어있는데, 그걸 i라는 변수의 메모리 위치에 배정

j=i+20; // i의 값을 cpu에서 가져와서 연산하고 register에 저장한 다음에 j라는 변수의 메모리 위치에 배정

30=10+20; // 배정문의 LHS에 상수가 올 수 없다.

단축 배정 연산자

i = i+8; 이거 대신에 i += 8 가능

op1 <<= op2; //op1에다가 <<op2연산한 것을 다시 op1에 넣는 작업

연산자의 우선순위

1. (), []

2. ++, --, ~(혹은 -), !

3. *, /, %

4. +, -

5. >>, >>>, <<<

6. >, >=, <, <=

7. ==, !=,

8. &

9. ^(XOR)

10. |(논리합)

11. &&

12. ||

13. ? :

14. =

a-b-c은 왼쪽부터 계산한다.(같은 우선순위내에서는 왼쪽부터)

(하지만 배정 연산은 오른쪽부터 계산한다. a = b = c = 1(c=1부터 함, b=c, a=b 이렇게 됨)

ex)

(4+5*2/2)=9

(-5 - -2 * 8 / (4 - 2) * 3)

우선순위

(4-2) 

-5

-2

-2*8

이후 */*은 왼쪽순으로

답은 19

문자열(String)(char은 문자형으로 기본 자료형에 속하고, 문자열(String)은 클래스의 객체로서 구현됨)

String str1 = "아! 대한민국!"; //자바의 String은 객체로 표현되지만 일반 변수처럼 사용이 가능하다.

String str2 = "Korea";

String str3;

String str4 = new String("Korea");

String str5 = str2 + str1; //str5는 결국 Korea 아! 대한민국 이란 String이 된다.

매개변수(Argument)

매개변수로 입력된 값은 문자열(String)의 배열로서 저장된다.

선택문(if문, if-else문, if-else if-else문, nested if문, switch문)

ex)(nested if문 사용시 주의)

int score = 89;

if ( score > 60)

if ( score > 70)

if ( score > 80)

if ( score > 90)

System.out.println("A학점");

else

System.out.println("학점취득 실패"); 

(아무것도 안뜬다. 왜냐하면 이 else는 첫번째 if문의 else에 걸린다. 마지막 if문에 걸리는게 아니다. 따라서 if문을 쓸 때 중괄호를 생략하지 말자.)


ex)(Swtich문)

int num = 2;

switch (num) //정수 혹은 string만을 argument로 받을 수 있음

{

case 1 :

System.out.println("num의 값은 1입니다");

break;

case 2 :

System.out.println("num의 값은 2입니다");

break; // 만약 break;를 지운다면, 그 이하 default도 실행이 되니까 조심

default : // default를 지정안하면 case가 없는 경우 그냥 끝남, default를 지정하면 없는 case일 때 실행함

System.out.println("num의 값은 1도 2도 아닙니다");

break;

}

ex)(switch문, string예제)

String str = "A";

        switch(str){

        case "A": 

            System.out.println("1");

        case "B":

            System.out.println("2");

        case "C" :

            System.out.println("3");

        default :

            System.out.println("그 외의 숫자");

    }

반복문(while문, do-while문, for문)

do-while문은 조건을 나중에 검사함으로써 반복될 문장이 최소 한번은 실행, 메뉴를 먼저 print한 다음에 input받고 while 돌리는 형태에 적합

for문의 기초 문법

for(초기식; 조건식; 증감식)
 {

반복될 문장들;

}

for문의 처리 순서:초기식->조건식->(참이면)반복문장->증감식->조건식->...

ex)(for문 내의 지역변수 or 글로벌 변수 차이)

int i, sum = 0; // i가 글로벌?변수라서 for문밖에서도 사용 가능

for ( i = 1 ; i <= 10 ; i += 1)

{

sum += i;

}

System.out.println("1부터 " + i + "까지의 합 = " + sum); // 이 경우 i=11나와서 문제임


ex)

int sum = 0;

for ( int i = 1 ; i <= 10 ; i += 1)

sum += i;

System.out.println("1부터 " + i + "까지의 합 = " + sum);

(이 경우 i는 지역(local)변수로서 사용하고 사라지기 때문에 System... 이 줄에서 문제가 발생함)


ex)

int a, b ;

for ( a = 1, b = 10 ; a < b ; a++, b--)

{

System.out.println("a = " + a);

System.out.println("b = " + b);

}

(초기식과 증감식에 콤마로 분리하여 두개 이상 넣을 수 있음)

(초기식, 조건식, 증감식 모두 생략할 수도 있다(null statement), 조건식을 생략하면 항상 True여서 loop됨)

관련 문법

break문

가장 가까운 반복문을 빠져나간다.(여러개의 반복문 사용시 가장 안쪽 반복문을 빠져나감)

continue문

가장 가까운 반복문의 시작으로 간다.(여러개의 반복문 사용시 가장 안쪽 반복문을 빠져나감)

while, do-while은 조건(평가)식으로 이동

for문은 증감부분으로 이동

return문

메소드를 호출한 지점에 값을 반환하며(void였다면 값 반환 안하고) 메소드를 종료한다.

반환 and 종료 (둘의 의미를 가짐)


배열(Array)

기본 문법:자료형 [][] name = new 자료형[size]; 

ex)(array의 선언과 생성 동시에 하는법)

int [][] id_and_score = new int[5][2];

String add_and_name [][] = new String [10][10];

int [][] score = new int [3][];

score[0] = new int[2];

score[1] = new int[3];

score[2] = new int[4];

(마지막 예제는, 정사각형모양이 아닌, 각 행의 요소의 개수가 다르게 생성가능)

(이후 score[0][1] 이렇게 접근이 가능)


ex)

int[] id = new int [5];

int[0] = 22311123;

int[1] = 12313222;

(배열의 생성과 동시에 초기화도 가능하다.)

혹은

int id [] = { 22311123, 12313222, ... }; // {}의 콤마 개수로 id의 size결정됨


ex)2차원 Array의 생성과 동시에 초기화

int [][] id_score = { {70,80,90}, {98, 69, 49, 97},, ...}

그럼 {70,80,90}은 첫 행(row)의 정보이다.

{98, ~~}은 2행의 정보이고, 따라서 톱니형 array일 것이다.


배열.length

배열의 size가 나온다.

ex)(다차원 배열의 length)

int id_score [][] = { {70, 80, 90}, {98, 23, 43, 54}};

System.out.println("id_score의 배열크기는" + id_score.length); // 행의 개수 2가 나옴

System.out.println("id_score의 배열크기는" + id_score[0].length); // 0행의 열개수 3이 나옴

System.out.println("id_score의 배열크기는" + id_score[1].length); // 1행의 열개수 4가 나옴

(1차월 배열은 그냥 열의 개수가 나옴)


객체지향 이론과 역사

컴퓨터를 통하여 실세계와 같은 환경을 흉내(simulation)내기 위해 발전한 이론

실세계의 모든 사물들은 "속성(attribute)+기능(method)"로 구성

실세계의 사물들은 각기 다른 속성과 기능을 가지고 상호작용하여 살아간다.

객체지향 이론은 1960년대 클래스(class), 상속(inheritance), 캡슐화(encapsulation), 다형성(polymorphism)등의 개념을 중심으로 발전


객체지향과 대비되는 개념으로 절차지향(Procedural-oriented)가 있다.

절차지향이란 프로그램의 기본 단위가 절차 또는 함수로 정의되며, 절차 또는 함수에 의해 속성(데이터)들이 공유되는 형태

(절차지향은 동사위주, 객체지향은 주어(명사)+동사 함께)


객체지향의 장점

문제를 쉽고 자연스럽게 프로그램화(모델링)할 수 있다.

쉬운 프로그램의 개발로 인한 생산성 향상 시킬 수 있다.

프로그램 모듈을 재사용할 수 있다.


클래스(Class)

객체를 생성하는 template이다.

(롤의 챔피언들을 class 사용없이 한다고 하면, String Teemoname = "Teemo"; int Teemopower = 80; ,... 이짓을 챔피언 마다 해야한다. 각 챔피언들 마다 갖는 속성이 있다. 그런것들을 모아서 class로 만들어서 각 챔피언마다 class안에서 정의했던 속성, 메소드 등을 사용하겠다는 생각)

클래스로부터 객체를 생성하는 과정을 실체화(instantiation)라고 한다.

객체를 instance 혹은 object라 한다.(둘의 차이를 구글링해봤더니 다른데에 신경쓰라는 답변이 추천수가 제일 많은...)

클래스를 구성하는 것은 "클래스헤더+속성(attribute)+생성자(Constructor)+기능(method)"이다.

클래스 선언하는 부분을 클래스 헤더라 한다.

기본문법:"[public/디폴트/final/abstract] class 클래스이름 extends 상위클래스이름 {~}"

(혹은 extends 상위클래스, implements 인터페이스 등이 뒤에 추가될 수도 있다.)

public:모든 클래스로부터 접근이 가능한 class(즉 객체 생성가능)

디폴트:같은 패키지내의 클래스에서만 접근 가능(즉 객체 생성가능)

final:subclass를 가질 수 없는 클래스, 정보보호측면에서 유리

abstract:객체를 생성할 수 없는 클래스

속성(attribute)

속성의 구성:

멤버변수:메소드 밖에서 정의된 변수(접근을 "객체이름(객체참조변수).멤버변수", 단, 클래스 변수의 경우는 "클래스이름.클래스변수" 로 사용)

기본문법:"[private/디폴트/protected/public][static/final/디폴트] type name"

객체변수:객체가 가질 수 있는 속성을 표현

static/final 의 한정자를 붙이지 않으면(디폴트) 객체변수이다.

local variable의 개념

객체속성변수:객체가 가질 수 있는 속성을 나타내는 값으로 기본 자료형의 값들로 구성값을 가진다.

ex) int vol; int width;

객체참조변수:선언된 객체를 지칭(참조)하는 변수, 사용자는 객체를 선언한 후 생성한 다음 객체참조변수를 통해 객체의 멤버들에 접근가능, 객체에 대한 참조 즉 주소를 가진다.

ex)Box mybox1; String boxname; //mybox1의 선언으로 memory상에 mybox1의 null 상태로 위치만 갖는다. 

ex)Box mybox1 = new Box(10,20,30); // 객체의 선언과 객체참조변수, 객체의 생성까지 한번에, 생성까지하면 각 객체변수(width, height, depth등의 시작점을 메모리 번지값으로 갖는다.)

클래스변수

static을 사용하여 선언

객체를 생성하지 않아도 사용이 가능하다.(클래스가 메모리에 올라갈 때 자동적으로 생성되므로)

global variable의 개념

같은 클래스로부터 생성된 모든 객체들이 하나의 클래스 변수를 공유

즉 클래스변수는 하나의 같은 클래스로부터 생성된 객체들 사이의 통신이나 객체들 사이의 공통된 속성을 표현하는데 사용

따라서 일반변수와 달리 객체이름을 통해 접근 불가, 클래스이름을 통해서 접근한다.

(예를 들면 Park씨집안의 class를 만든다하자. 그럼 last name은 모두 Park일 것이다. 이런 경우 static String lastname = "Park" 을 사용하여 lastname은 Park을 한번만 할당하여 메모리 할당을 한번만 하는 이점을 얻을 수 있다. 만약 그냥 String lastname = "Park"을 하면 class를 통해 객체를 만들 때 마다 객체변수 lastname이 메모리에 객체 마다 할당되어서 메모리를 많이 쓰게 된다.)

(혹은 클래스내에 정의된 메소드를 호출할 때 마다 클래스 내에 있는 static 클래스 변수를 ++하게 해주면 실행횟수를 count하게 된다.)

Ex)(count할 때 쓰는 클래스 변수)

public class Counter  {

    static int count = 0;

    Counter() {

        this.count++;

        System.out.println(this.count);

    }


public static void main(String[] args) {

Counter c1 = new Counter();

      Counter c2 = new Counter();

 }

}

(main에서 Counter 클래스의 객체를 생성할 때마다 count는 1씩 증가한다. 만약에 static int count가 아닌 int count였다면 각 객체 c1마다 count가 생성되므로 각 객체마다 count가 있기 때문에 정말 원하는 count를 할 수가 없다.)

종단변수

final을 사용하여 선언

변할 수 없는 상수 값을 가짐

final이 붙은 변수는 단 한번 초기화 할 수 있으며 그 이후에는 그 값을 변경할 수 없음

상수 변수를 관례상 대문자로 표현하듯이, 종단변수는 대문자로 나타낼 떄가 많다.

접근한정사의 사용

private:클래스 정의하는 내에서만 사용가능

디폴트:같은 패키지내에서만 사용가능

protected:같은 패키지 or subclass에서만 사용가능(다른 패키지지만 subclass인 것은 가능하다는 것)

public:외부 객체에서 마음대로 접근가능

(모든 멤버변수는 그 클래스 전체에서는 유효하다.)

(class A와 다른 패키지에서 만든 class B, B는 A의 subclass도 아닌 경우에 B내부에서 A o = new A();하면 A내부에서 public으로 선언한 멤버변수만 접근가능)

(class A와 다른 패키지에서 만든 class C, C는 A의 subclass인 경우 B내부에서 A o = new A();하면 A내부에서 public이랑 protected로 선언한 멤버변수에 접근가능)

(class A와 같은 패키지에서 만든 class C, C는 A의 subclass이거나 아닌 경우에도 C내부에서 A o = new A();하면 A내부에서 public, protected, 디폴트로 선언한 멤머변수에 접근가능)

생성자(Constructor, 메소드의 사용법을 따르기도하고 생성자메소드라 부르기도 한다.)

모든 클래스는 객체를 생성할 때(instantiation) 생성자를 사용한다.

매개변수가 없는 생성자를 기본 생성자라 한다.

생성자를 작성하지 않는다면 컴파일 할 때 매개변수가 없는 기본생성자가 자동으로 만들어진다.

(public class이름() {} 이 자동으로 들어가서 컴파일이 됨)

생성자는 클래스 이름과 동일하게 사용한다. ex)

생성자를 하나라도 프로그래머가 작성하였다면 기본생성자는 만들어지지 않는다.

생성자는 returntype이 없다.

매개변수가 다른 생성자를 여러개 만드는 오버로딩이 가능하다.

this와 super로 생성자를 호출할 수 있다.

생성자의 역할:

생성자가 하는 일은 객체가 될 때 필드를 초기화 하는 역할을 수행한다.(클래스로부터 객체를 만들때마다 매개변수를 받아와야하는 경우일 때 사용)

기능(method):클래스 안에서 정의된 함수

기본문법:"[private/디폴트/protected/public][static/final/abstract/synchronized] returntype name([매개변수들])"

(혹은 throws 예외클래스 가 추가될 수도 있다.)

접근한정자(private/디폴트/protected/public)은 멤버변수에서의 사용과 똑같다.

클래스메소드

static을 사용한다.

객체변수를 사용하지 않는 메소드인 경우 static을 붙인다. 그럼 메소드 호출시간이 짧아지기때문에 효율적이다.

클래스메소드 안에서는 클래스 변수만을 사용할 수 있다. 그러다보니 수학함수들에 많이 사용 된다.

호출방법:클래스이름.메소드명(매개변수), 즉 객체를 통한 접근은 불가능하다.

종단메소드

final을 사용한다.

subclass에서 overriding이 될 수 없다.

추상메소드

abstract을 사용한다.

애초에 클래스가 추상클래스여야 추상클래스 내에서 선언이 가능하다.

선언부분만 가지고 몸체부분은 가질 수 없다.

몸체부분은 subclass에서 overriding

synchronized메소드

thread를 동기화 할 수 있는 기법을 제공하기 위해 사용

접근한정자에 대해

public:소속된 클래스가 접근 가능하면 항상 접근 가능

private:소속된 클래스 내에서만 사용가능, 클래스 외부에서 접근하려면 오류가 발생

protected:메소드가 소속된 클래스의 하위클래스와 같은 패키지에 있는 다른 클래스에서만 사용가능

메소드의 name은 소문자로 시작하는 것이 관례

메소드 매개변수:메소드내에서만 사용가능한 변수, 메소드 호출시 값이나 주소가 전달되는 형식매개변수로서 메소드 내에서만 유효하다.

객체이름.메소드(매개변수) 형태로 객체에 일을 시킬 수 있고, 일을 시키는 행위를 메시지(message)라 한다.(클래스메소드는 호출방법이 다름)

해당 클래스에서 메소드를 찾아 수행하되, 해당 클래스에 없다면 상위클래스에서 메소드를 찾는다. 이후 최상위 클래스에서도 없으면 오류 발생

클래스로부터 생성된 객체는 속성만 가지고 메모리에 생성된다.

메소드는 클래스(클래스 메모리 영역)에 저장되어 객체들이 공유한다. 

returntype은 void가 아니면 반드시 메소드 내에 return문 사용하여서 지정된 type을 반환해야만 한다. 이대 기본 자료형, 참조 자료형 모두 returntype가능

지역변수(혹은 형식 매개변수)란 클래스 내에서 메소드를 정의할 때 메소드의 몸체에서 정의된 변수이다. 메소드가 실행이 완료되면 사라진다.

변수의 유효범위(scope로) 변수를 분류하면 멤버변수>메소드 매개변수와 메소드 내의 지역변수>예외 처리기 매개변수

예외 처리기 매개변수(exception handler parameter):예외 처리를 위한 매개변수

메소드 argument passing

call-by-value로, 실 매개변수의 값만을 형식 매개변수에 복사해주는 방식이다.

매개변수가 기본 자료형은 실제값을 복사, 참조 자료형은 참조 자료형에 있던 주소만을 복사해서 형식 매개변수에 전달




상속(Inheritance)

기존 클래스의 모든 속성과 기능을 상속받고, 더 필요한 속성과 메소드를 추가하여 새로운 클래스를 생성하는 개념

객체지향의 장점인 모듈의 재사용과 코드의 간결성을 제공하는 중요한 특성

모든 자바 프로그램은 상위 클래스를 가진다.(상위 클래스를 지정하지 않으면 Object 클래스가 묵시적인 상위 클래스)

상속의 형식



캡슐화(encapsulation)

객체가 동작하는 기능만 알고 그 객체를 사용하게 하는 개념

객체의 자세한 동작 방법은 비밀

비밀을 알려고 하면 오류 발생

이를 통해 정보 은폐(information hiding)가능

캡슐화의 장점:

객체에 포함된 정보의 손상과 오용을 막는다

객체 내부의 조작 방법이 바뀌어도 사용방법은 바뀌지 않는다.

데이터가 바뀌어도 다른 객체에 영향을 주지 않아 독립성이 유지

처리된 결과만 사용하므로 객체의 이식성이 좋다.

객체를 부품화 할 수 있어 새로운 시스템의 구성에 부품처럼 사용할 수 있다.

다형성(Polymorphism)

다형성은 서로 다른 객체가 동일한 메시지에 대하여 서로 다른 방법으로 응답하는 기능을 의미한다.

오버로딩:동일한 이름의 메소드(생성자 등)을 만드는 것이다. 메소드(생성자)를 사용시 다양한 매개변수를 받기 위함이다. 동일한 기능에 따가 다양한 매소드를 만들면 복잡하고 관리하기가 어렵기 때문이다.

생성자 오버로딩

조건:같은 클래스내에서, 같은 이름의 생성자, 매개변수 개수가 다르거나, 개수가 같아도 매개변수의 자료형의 순서가 다르면 된다. 개수가 같아도 자료형이 달라도 된다.

ex) public Box5() {...}, public Box5(int w) {...}, public Box5(int w, int h) {...}, public Box5(String name, int w){...}, public Box5(int w, String name){...} 

ex)(생성자 오버로딩시 유의할 점)

public Box(String name, String color, int w){...}

public Box(String color, String name, int w){...}

은 생성자 오버로딩이 아니다. 이후 생성자 Box를 사용하여 객체만들 때 오류가 발생, 즉 매개변수의 개수 and 자료형(형식매개변수의 이름이 아닌)이 같은 순서로 들어오면 안된다. (str, str, int)

다만, (str, str, int)랑 (str, int, str)은 오버로딩 가능

메소드 오버로딩

조건:같은 클래스내에서, 같은 이름의 메소드명, 매개변수 개수가 다르거나, 개수가 같아도 매개변수의 자료형이 다르거나, 개수가 같아도 매개변수의 자료형의 순서가 다르면 된다. 

메소드 오버로딩시 유의할 점: 메소드명과 매개변수의 자료형과 순서가 같고, returntype만 다르면 오버로딩이 되지 않는다. 생성자 오버로딩에서와 마찬가지로 형식 매개변수의 이름은 오버로딩 성립에 영향을 주지 않는다.

this사용법

용도1:생성자 내에서 다른 생성자를 호출시 사용한다

ex)

class Box5{ 

int width;

int height'

int depth;

public Box5()

{

this(1,1,1);

}

public Box5(int w)

{

this(w,1,1);

}

public Box5(int w, int h, int d)

{

width = w;

height = h;

depth = d;

}

}

public class Box5Test { 

Box5 mybox1 = new Box5();

Box5 mybox2 = new Box5(10);

Box5 mybox3 = new Box5(10,20,30);

}

(굳이 Box5(int,int,int)가 제일 하단에 있을 필요는 없음)

용도2:메소드의 형식매개변수명과 객체자신이 갖고있는 멤버변수명이 같아서 구분시에 사용한다.

ex)

class This_2 {

int i;


public void method1(int i) {

this.i=i;

}

}

(여기서 this.i는 클래스 This_2의 멤버변수(객체변수) i를 가리킨다.








































+ Recent posts