[Java의 정석] Chapter06 객체지향 프로그래밍1

zoey·2023년 9월 30일
0

Java의 정석

목록 보기
3/9

2023/09

1 객체지향언어

1.1 객체지향언어의 역사

객체지향이론의 기본 개념

  • 실제 세계는 사물(객체)로 이루어져있으며, 발생하는 모든 사건들은 사물간의 상호작용이다
  • 실제 사물의 속성과 기능을 분석한 다음 데이터(변수)와 함수로 정의함으로써 실제 세계를 컴퓨터 속에 옮겨 놓은 것과 같은 가상 세계를 구현하고 이 가상세계에서 모의실험을 함으로써 많은 시간과 비용을 절약할 수 있다.

1.2 객체지향언어

객체지향언어의 주요 특징

  • 코드의 재사용성이 높다
    • 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다
  • 코드의 관리가 용이하다
    • 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다
  • 신뢰성이 높은 프로그래밍을 가능하게 한다
    • 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.

⇒ 코드의 재사용성이 높고 유지보수가 용이하다

⭐️ 재사용성, 유지보수, 중복된 코드의 제거

2 클래스와 객체

2.1 클래스와 객체의 정의와 용도

클래스

  • 클래스의 정의 : 클래스란 객체를 정의해놓은 것이다
  • 클래스의 용도 : 클래스는 객체를 생성하는데 사용된다

클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다

객체

  • 객체의 정의 : 실제로 존재하는 것, 사물 또는 개념
  • 객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
  • 유형의 객체 : 책상, 의자, 자동차, TV와 같은 사물
  • 무형의 객체 : 수학공식, 프로그램 에러와 같은 논리나 개념

2.2 객체와 인스턴스

2.3 객체의 구성요소 - 속성과 기능

  • TvTest1
    class Tv {
    	String color; //색깔
    	boolean power; //전원상태
    	int channel; //채널 
    
    	void power(){
    		power = !power;
    	}
    	void channelUp(){
    		channel++;
    	}
    	void channelDown(){
    		channel--;
    	}
    }
    
    class TvTest {
    	public static void main(String args[]) {
    		Tv t;
    		t = new Tv();
    		t.channel = 7;
    		t.channelDown();
    		System.out.println("현재 채널은 " + t.channel + "입니다.");
    	}
    }
  • TvTest2
    class Tv {
    	String color; //색깔
    	boolean power; //전원상태
    	int channel; //채널 
    
    	void power(){
    		power = !power;
    	}
    	void channelUp(){
    		channel++;
    	}
    	void channelDown(){
    		channel--;
    	}
    }
    
    class TvTest2 {
    	public static void main(String args[]) {
    		Tv t1 = new Tv();
    		Tv t2 = new Tv();
    		System.out.println("t1의 channel 값은 " + t1.channel + "입니다.");
    		System.out.println("t2의 channel 값은 " + t2.channel + "입니다.");
    
    		t1.channel = 7;
    		System.out.println("t1의 channel값을 7로 변경하였습니다.");
    		
    		System.out.println("t1의 channel 값은 " + t1.channel + "입니다.");
    		System.out.println("t2의 channel 값은 " + t2.channel + "입니다.");
    }

2.4 인스턴스의 생성과 사용

2.5 객체 배열

2.6 클래스의 또 다른 정의

3 변수와 메서드

3.1 선언위치에 따른 변수의 종류

인스턴스 변수 (instance variable)

클래스 변수 (class variable)

지역 변수 (local variable)

3.2 클래스 변수와 인스턴스 변수

3.3 메서드

메서드(method)는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다

메서드를 사용하는 이유

  • 높은 재사용성 (reusability)
  • 중복된 코드의 제거
  • 프로그램의 구조화

3.4 메서드의 선언과 구현

3.5 메서드의 호출

3.6 return문

3.7 JVM 메모리 구조

3.8 기본형 매개변수와 참조형 매개변수

3.9 참조형 반환타입

3.10 재귀호출(recursive call)

3.11 클래스 메서드(static메서드)와 인스턴스 메서드

3.12 클래스 멤버와 인스턴스 멤버간의 참조와 호출

4 오버로딩(overloading)

4.1 오버로딩이란?

자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다. 이처럼 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading)' 또는 '오버로딩(overloading)'이라 한다.

4.2 오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.

주의할 점 : 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다

4.3 오버로딩의 예

대표적인 예 : println 메서드
println메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println 메서드가 달라진다

//보기1
//오버로딩 성립X
//매개변수의 이름만 다를 뿐 매개변수의 타입이 같음
int add(int a, int b){return a+b;}
int add(int x, int y) {return x+y;}
//보기2
//오버로딩 성립X
//리턴타입만 다름
int add(int a, int b){return a+b;}
int add(int a, int b) {return long(a+b);}
}
//보기3
//오버로딩 성립O
//두 메서드 모두 int형과 long형 매개변수가 하나씩 선언되어있지만 서로 순서가 다름
int add(int a, long b){return a+b;}
int add(long a, int b) {return a+b;}
}

4.4 오버로딩의 장점

  • 오버로딩을 통해 여러 메서드들이 하나의 이름으로 정의될 수 있다
    기억하기 쉽고, 이름도 짧게 할 수 있어서 오류의 가능성을 많이 줄일 수 있다.
  • 메서드의 이름을 절약할 수 있다.
    하나의 이름으로 여러 개의 메서드를 정의할 수 있으니, 메서드의 이름을 짓는데 고민을 덜 수 있는 동시에 사용되었어야 할 메서드의 이름을 다른 메서드의 이름으로 사용할 수 있다

4.5 가변인자(varags)와 오버로딩

타입... 변수명 과 같은 형식으로 선언한다

public PrintStream printf(String format, Object... args){
 ...
}
String concatenate(String s1, String s2) {...}
String concatenate(String s1, String s2, String s3) {...}
String concatenate(String s1, String s2, String s3, String s4) {...}

위 코드를 아래와 같이 대체할 수 있다

String concatenate(String... str) {...}


System.out.println(concatenate()); //인자가 없음
System.out.println(concatenate("a")); //인자가 하나
System.out.println(concatenate("a", "b")); //인자가 둘
System.out.println(concatenate(new String[]{"A", "B"})); //배열도 가능

가변인자는 아래와 같이 매개변수타입을 배열로 하는 것과 어떤 차이가 있을까?

String concatenate(String[] str) {...}

String result = concatenate(new String[0]) //인자를 배열로 지정
String result = concatenate(null) //인자를 null로 지정
String result = concatenate() //에러!! 인자가 필요함

매개변수 타입을 배열로 하면, 반드시 인자를 지정해줘야하기 때문에, 위의 코드에서처럼 인자를 생략할 수 없다. 그래서 null이나 길이가 0인 배열을 인자로 지정해줘야하는 불편함이 있다.

5 생성자(constructor)

5.1 생성자란?

5.2 기본 생성자

5.3 매개변수가 있는 생성자

5.4 생성자에서 다른 생성자 호출하기

5.5 생성자를 이용한 인스턴스의 복사

6 변수의 초기화

6.1 변수의 초기화

6.2 명시적 초기화

6.3 초기화 블럭

6.4 멤버변수의 초기화 시기와 순서

0개의 댓글