자바 기초
자바기초개념 다시잡기 자바의정석 - 객체지향
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)생성자
- 클래스 변수 초기화 시점은 클래스가 처음 로딩될때 단 한번
- 인스턴스 변수 초기화 시점은 인스턴스가 생성될때 마다