자바 기초

자바기초개념 다시잡기 자바의정석 - 객체지향

H-V 2021. 7. 22. 20:34

남궁성님의 자바의 정석 - 기초편 유투브 참조!

 

1. 객체지향(OOP - Obejct Oriented Programming)

  • 객체지향을 알면 자바에 대해서 절반은 안다고 봐도 좋다
  • 절차적 프로그래밍에서 객체지향의 프로그래밍으로 80년대 초부터 발전함
  • 객체지향 = 재사용성이 높고, 유지보수 용이 및 중복코드제거에 탁월
  • 객체지향의 핵심은 슐화/속/상화/다형성

 

2. 클래스와 객체

  • 클래스 - 객체를 정의해 놓은것 (설계도) --> 객체를 생성하는데 사용
  • 객체 - 클래스를 바탕으로 존재하는 것(제품/개념등) --> 객체가 가지고 있는 기능과 속성을 정의한 것
  • 객체는 속성(변수) + 기능(메서드) 로 이루어짐 
  • 객체와 인스턴트는 같은 말. 객체는 인스턴스를 대표하는 일반적 용어 
  • 인스턴스는 클래스로부터 생성된 객체 (Class Tv --> Tv tv = new Tv())

  • 클래스 -> 객체정의 -> 인스턴스화 -> 인스턴스(객체), 즉 클래스를 정의하고 사용하려면 인스턴스를 만들어야함
  • 클래스는 왜 필요해요? -> 객체를 생성하기 위해
  • 객체가 왜 필요해요 -> 객체를 사용하기 위해
  • 객체를 사용한다는 것은? 그 객체의 속성(변수)/기능(메서드)를 사용하는 것. 
class Tv { //1) 클래스(설계도) 생성
	String color;
	boolean power;
	int channel;
	
	void power() {power = !power;}
	void channelUp() {++channel;}
	void channelDown() {--channel;}
}

public class Ex_1 {
	public static void main(String[] args) {
		Tv t = new Tv();  //2) 클래스 기반 객체 생성
		t.channel = 12; //3) 객체 사용
		t.channelDown();
		System.out.println("Current channel: " + t.channel);
		t.power = true;
		System.out.println("The tv is on: " + t.power);
		t.color = "Green";
		System.out.println("The TV's color is: " + t.color);
	}
}

//4) 객체 사용 결과
Current channel: 11 
The tv is on: true
The TV's color is: Green

 

 

3. 클래스 개념

  • 클래스는 1) 설계도 2) 데이터+함수 3) 사용자 정의 타입으로 정의 할 수 있다
  • 데이터(변수) + 함수로 클래스를 생성 한다
  • 사용자 정의 타입이란 개발자가 직접 원하는 타입을 만들 수 있다
class Time {
	int hour;
	int minute;
	int second;
}
public class Ex_2 {
	public static void main(String[] args) {
		//객체지향없이 하드코드시에는 일일이 값을 바꿔줘야한다
		int hour = 12;
		int minute = 33;
		int second = 22;
		
		//클래스로 정의하고 객체화해서 필요할때마다 불러서 쉽게 변경 가능
		Time t = new Time();
		t.hour = 13;
		t.minute = 32;
		t.second = 55;
	}
}

 

 

4. 선언위치에 따른 변수 종류

  • 객체지향을 바탕으로 만들어진 클래스는 변수를 클래스영역과 메소드 영역으로 구분해서 가진다
  • 클래스 내부에서는 변수선언/메소드선언만 된다
  • 인스턴스변수는 개별적 부분에, 클래스변수는 공통으로 들어가야하는 부분에서 선언

  • 메서드(함수)의 역할은 코드중복을 줄이고 메서드 하나를 선언해놓으면 어디에서든지 편하게 호출해서 쓸수있다
  • 메서드의 반환타입은 반드시 리턴이나 결과값과 같도록 지정해야한다. 
  • 하나의 메서드는 한가지 기능만 수행하도록 작성해야한다. (메서드는 선언부 + 구현부로 구현)

( ) 에는 매개변수(함수를 통해 입력되는 값)가 들어간다!

class cal {
	public void gugudan(int a) { //입력받아 함수를 진행할 값
		for (int i=1; i<10; i++) {
			System.out.println(a+": " + a + " * " + i + " = " + (a*i));
		}
	}
}
public class Ex_3 {
	public static void main(String[] args) {
		cal a = new cal();
		a.gugudan(3); // 함수에 들어갈 값
	}
}
3: 3 * 1 = 3
3: 3 * 2 = 6
3: 3 * 3 = 9
....

class myMath {
	public int max(int a, int b) {
		return a > b ? a : b;
	}
}
public class Ex_4 {
	public static void main(String[] args) {
		myMath a = new myMath();
		System.out.println(a.max(4, 5));
	}
}
5

 

5. return문

  • 실행중인 메서드를 종료하고 호출한 곳으로 되돌아가거나 또는 함수의 기능안의 결과를 리턴한다 
  • 반환타입이 void이면 return 생략 가능, 아니면 반드시 return 필요

 

6. 기본형/참조형 매개변수

  • 기본형은 읽기만 가능, 참조형은 읽고 변경 가능
  • 기본형은 부여된 값(readOnly)을 주고 참조형은 객체가 들고있는 주소(read/write)를 준다고 생각하자
  • 참조형이 리턴이되면 그 참조형의 주소가 반환 된다.
class Data {int x;}
public class Ex_5 {
	public static void main(String[] args) {
		Data d = new Data();
		d.x = 10;
		System.out.println("d.x = " + d.x);
		change(d.x);
		System.out.println("==메소드종료==");
		System.out.println("d.x = " + d.x);

	}

	static void change(int x) { //기본형
		x = 1000;
		System.out.println("change's x = " + x);
	}
}
d.x = 10
change x = 1000
==메소드종료==
d.x = 10


class Data {int x;}
public class Ex_5 {
	public static void main(String[] args) {
		Data d = new Data();
		d.x = 10;
		System.out.println("d.x = " + d.x);
		change(d);
		System.out.println("==메소드종료==");
		System.out.println("d.x = " + d.x);

	}

	static void change(Data d) { //매개형
		d.x = 1000;
		System.out.println("change's x = " + d.x);
	}
}
d.x = 10
change x = 1000
==메소드종료==
d.x = 1000

 

 

 

7. 오버로딩(overloading)

  • 한 클래스 안에 같은 이름의 메서드를 여러개 정의하는 것 (대표 예: println)
  • 오버로딩 조건 1)메서드 이름 통일 2)매개변수의 개수 또는 타입이 달라야함 3)반환타입은 상관없음
class Calculator {
	int add(int a, int b) {
		return a + b;
	}
	long add(int a, long b) {
		return (long)(a + b);
	}
}
public class Ex_7 {
	public static void main(String[] args) {
		Calculator a = new Calculator();
		System.out.println(a.add(3, 5));
		System.out.println(a.add(3, 5L));
	}
}

8
8

 

8. 생성자

  • 인스턴스(객체)가 생성될 때 마다 호출되는 '인스턴스 초기화 메서드'
  • 이 인스턴스 초기화 메서드에 초기값을 세팅해놓으면  인스턴스(객체생성)하면 그 초기화값으로 항상 시작됨
  • 생성자의 이름은 반드시 클래스 이름과 같아야 한다(생성자도 오버로딩의 개념)
  • 생성자는 리턴값이 없다, 즉 대입문이다. (void 필요 없음)

모든 클래스는 반드시 생성자를 가져야한다 (생성자를 따로 만들지 않아도 클래스 생성시 자바컴파일에서 자동으로 하나(기본생성자=매게변수가없는 생성자(클래스이름() {})를 가지고 있다)

매개변수가 없으면 안의 내용으로 초기화

class Car{
	String color;
	String gear;
	int door;
	public Car(String c, String g, int d) {
		color = c;
		gear = g;
		door = d;
	}
	
}
public class Ex_8 {
	public static void main(String[] args) {
		Car c = new Car("green", "auto", 4);
		System.out.println("Color: " + c.color + " Gear: " + c.gear + " Door: " + c.door);
	}
}
Color: green Gear: auto Door: 4

8-1 생성자 this / 참조변수 this

  • 생성자에서 다른 생성자 호출할때 사용 (코드 중복 제거)
  • 생성자 this는 항상 첫줄에서만 호출
  • 참조변수 this는 자신을 가리키는 인스턴스용 참조변수를 말함. 지역변수와 인스턴스변수를 구별할때 사용
class A {
	int x, y;
	public A(int x, int y) { //2) 그 매개변수의 값이 곧 지역변수에 들어가고
		this.x = x; //3) 그 지역변수 값이 이 매개변수에 전환된다면서 항상 이 기능과 값으로 초기화
		this.y = y;
		System.out.println("x, y = " + x + "," + y);
	}
}
public class Ex_9 {
	public static void main(String[] args) {
		//1) 클래스를 인스턴스(객체)화 하면서 매개변수 값을 넣고
		//   생성자가 있으므로 항상 생정자가 가진 기능으로 초기화
		A a = new A(5, 6); 
		
		//기본생성자의 값을 바꿀수도있다. 
		a.x = 10;
		a.y = 20;
		System.out.println("a.x, a.y = " + a.x + ", " + a.y);
	}
}
x, y = 5,6
a.x, a.y = 10, 20

8-2 변수의 초기화

  • 지역변수는 수동 초기화를 사용전에 꼭 해야한다. 
  • 멤버변수는 자동 초기화가 된다.
    초기화란 변수에 값을 줘서 사용 가능하도록 만들어야한다는 뜻
  • 멤버변수 초기화 방법 1)명시적(=) 20 2)초기화 블럭({}) - 거의 안씀 3)생성자
  • 클래스 변수 초기화 시점은 클래스가 처음 로딩될때 단 한번
  • 인스턴스 변수 초기화 시점은 인스턴스가 생성될때 마다