본문 바로가기

전공 과목 시험정리/JAVA

시험정리 + 풀이

객체지향 <-- > 절차지향

절차지향은 공유된 데이터와 문제 해결 절차를 중시하는 반면에,

객체지향은 프로그램을 객체들의 집합으로 보며 이러한 객체들이 프로그램의 중심이 됨.


객체와 클래스

객체는 효율적인 정보를 관리하기 위해서 사람들이 의미를 부여하고 분류하는 논리적인 단위이다.


이때 클래스는 이 객체를 만드는 틀 개념으로, 같은 형식의 (동일한 속성과 메소드) 객체를 한번에 많이 만들 수 있다.


붕어빵은 객체에, 붕어빵틀은 클래스 라고 볼 수 있다.


아래 코드 처럼 객체를 선언할 때는 new 키워드를 사용하는데,

[class] [객체명] = new [class]();

식으로 사용한다. 


[+] 최상위 클래스는 Object 이다.


객체지향 언어의 특징

1. 캡슐화

1
2
3
4
5
6
7
8
9
10
class car {
    public void drive() {
        .........
    }    
}
 
public static void main(String[] args) {
    car poo = new car();
}
 
cs

이런 코드가 있다고 가정했을 때, 

객체인 poo 입장에서는 단지 drive 를 실행하기만 하면 될 뿐, drive의 내부 루틴을 알 필요가 없다. 

이를 캡슐화 라고 한다.


외부에서 접근할 수 있는 객체의 속성과 메소드는 접근 권한을 외부에서도 사용할 수 있게 해줘야 하고, 객체 내부에서만 알고 있어야 하는 속성과 메소드는 외부에서 접근할 수 없게 해야 한다.


이를 위해 객체를 구성하는 속성과 메소드는 접근 제어자를 사용하여 접근 권한을 분명하게 표시하고 있으며, 이를 통해 캡슐화와 정보 은닉이 가능해진다.


% (접근제어자) : public, private... 등


2. 상속

만약에 정의하려는 클래스가 이미 정의된 것과 비슷하다면 다시 정의할 필요 없이,

해당하는 클래스를 상속받으면 된다. 그리고 거기에 자기가 필요한 메소드나 속성을 다시 추가하면 된다.


3. 다형성

다형성은 객체의 메소드 형태가 다양한 것을 의미한다.

대표적인 예로 메소드 오버로딩(Overloading) 과 오버라이딩(Overriding)이 있다.


메소드 오버로딩은 하나의 클래스에서 동일한 이름의 메소드가 매개 변수의 개수, 매개 변수의 타입 등을 달리해서 여러가지 형태로 존재하는 것을 말한다.


1
2
3
4
5
6
7
public void drive() {
    ......
}
 
public void drive(int speed) {
    ......
}
cs


이게 메소드 오버로딩이다.


메소드 오버라이딩은 

상속 관계에 있는 하위 클래스가 상위 클래스의 메소드를 재정의 하는 것 

을 말한다.


1
2
3
4
5
6
7
8
9
10
11
class songun{
    public void get_length(){
        return 170;
    }
}
 
class Geunyoung extends songun {
    public void get_length(){
        return 190;
    }
}

cs

songun 은 get_length() 에서 170을 리턴하지만,

songun을 상속받은 Geunyoung 은 190을 리턴한다.


( new Geunyoung(); 을 할 경우 당연히 190이 리턴된다. )


이처럼 자식 클래스에서 부모 클래스의 메소드를 재정의 하는 것을

메소드 오버라이딩 이라고 한다.


멤버 변수는 클래스를 정의할 때, 메소드 밖에 선언하는 변수를 말한다.

(객체가 가지는 정적인 속성을 나타내는데 사용)



접근제어자


접근제어자

 사용범위

 설명

 클래스

하위 클래스 

동일 패키지 

모든 클래스 

 private

- 자신 클래스 안에서만 

    사용 가능

 (default)

- 접근 권한 modifier를
    지정하지 않은 경우 

- 동일 패키지의 클래스만 

    접근가능

 protected

- 동일 패키지의 클래스

  또는 하위 클래스 관계

  인 클래스만 접근가능

 public

모든 클래스에서 접근가능


[+] 클래스의 접근 제어자는 (default) 나 public이 가능하다.

( 이때 public class 명 == 자바 파일명 임)

 

자바에서 제일 먼저 접근하는 메서드

는 main 메서드 


변수 이름 규칙

- 하나 이상의 글자여야 한다.

- 알파벳 대문자, 알파벳 소문자, 숫자, _ , $  만 사용할 수 있다.

- 자바 예약어는 사용할 수 없다.

- 길이 제한은 없다.

- 대문자와 소문자를 구별한다.

- 첫 문자로 숫자는 올 수 없다.


예약어 유의사항

- 모두 소문자이다.

- const, goto 는 현재 사용되지 않으나, 변수명으로는 사용할 수 없다.

(요즘은 const 대신 final 을 사용한다.)

- C/C++ 의 sizeof 는 사용되지 않는다.


데이터형 자동변환

1byte   2byte    4 byte        8byte   4byte   8byte

byte -> short -> char == int -> long -> float -> double


화살표 방향대로는 자동 형 변환.

반대 방향으로는 강제 형 변환.


생성자

클래스로 객체를 생성할 때, 자동으로 실행되는 메소드를 말한다.


1
2
3
4
5
6
7
8
9
class test{
    public void test() {
        System.out.println("class test!");
    }
}
 
public static void main(String[] args){
    test asdf = new test();
}
cs

위 코드에서 new  로 객체를 만들 때, 저기 test() 라는 메소드가 실행된다.

또한,

클래스를 정의할 떄 꼭 생성자를 만들어 줄 필요는 없다. (컴파일러가 알아서 만들어줌)



아스키 코드 값

0 : 48

A : 65

a : 97


this 키워드

this 의 정의

this 는 자기 자신 클래스 (객체)를 가리킨다.


this 의 특징

  • 객체 자신에 대한 참조 값을 가진다. (자신을 가리킨다.)
  • 메소드 내에서만 사용된다.
  • 객체 자신을 메소드에 전달하거나 리턴하기 위해 사용하기도 한다.
  • this 를 이용해 좀더 명확한 프로그램을 작성할 수 있다.

  • [+] static 메소드 에서는 this를 사용할 수 없다.
        static 메소드는 객체가 new 라는 키워드로 생성되기 이전에 메모리에 로딩이 되므로,
        아직 객체가 생성되지 않은 상태. 따라서 this 를 사용하면 안된다.
1
2
3
4
5
6
7
8
9
10
class test{
    int x;
    public void asdf(int get) {
        this.x = get;
    }
}
 
public static void main(String[] args){
    test asdf = new test(2);
}
cs


이 때 asdf.x 는 2의 값을 가진다.

이렇게 this 를 사용할 수 있다.







아래의 내용은 https://wikidocs.net/228 를 참고함.


Static 

1
2
3
4
5
6
7
8
public class HousePark  {
    String lastname = "박";
 
    public static void main(String[] args) {
        HousePark pey = new HousePark();
        HousePark pes = new HousePark();
    }
}

cs


이런 클래스가 있다고 했을 때, 위와 같은 클래스를 만들고 객체를 생성하면 객체마다 lastname을 저장하기 위한 메모리를 별도로 할당해야 한다. 하지만 가만히 생각해 보면 HousePark 클래스의 lastname은 어떤 객체이던지 동일한 값인 "박"이어야 할 것 같지 않은가? 이렇게 항상 값이 변하지 않는 경우라면 static 사용 시 메모리의 이점을 얻을 수 있다.


다음의 변경된 예제를 보자.

1
2
3
4
5
6
7
8
public class HousePark  {
    static String lastname = "박";
 
    public static void main(String[] args) {
        HousePark pey = new HousePark();
        HousePark pes = new HousePark();
    }
}
cs


위와 같이 lastname 변수에 static 키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되어 메모리 사용에 이점을 볼 수 있게된다.


static을 사용하는 또 한가지 이유로 공유의 개념을 들 수 있다. static 으로 설정하면 단 한곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유하게 되는 것이다. 다음의 예를 보면 더욱 명확하게 파악할 수 있을 것이다.

웹 사이트 방문시마다 조회수를 증가시키는 Counter 프로그램이 다음과 같이 있다고 가정 해 보자.

1
2
3
4
5
6
7
8
9
10
11
12
public class Counter  {
    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();
    }
}
cs



c1, c2 객체 생성시 count 값을 1씩 증가하더라도 c1과 c2의 count는 서로 다른 메모리를 가리키고 있기 때문에 원하던 결과(카운트가 증가된)가 나오지 않는다.

결과값은 다음과 같이 나온다.

1

1

이제 다음 예를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
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();
    }
}
cs

int count = 0 앞에 static을 붙였더니 원하는 값이 나온다.
    ( count 값이 공유됨)


메소드 앞에 static을 붙이면 그 메소드는 클래스 메소드가 된다.
    기본적인 원리는 변수와 동일하다. (메모리 공유)


















'전공 과목 시험정리 > JAVA' 카테고리의 다른 글

20150706 시험 정리  (0) 2015.07.06
Array + 반복문  (0) 2015.06.09
자바 언어의 이해  (0) 2015.04.30
가비지 콜렉션 (Garbage Collection)  (0) 2015.04.30
자바 다중 상속 지원.  (0) 2015.04.30