객체지향 언어
- 80년 초 소프트웨어의 위기 - 빠른 변화를 못쫓아감
- 해결책으로 객체지향 언어를 도입(절차적 -> 객체지향)
- 1996년 Java가 나옴
- 코드의 재사용성이 높고 유지보수가 용이, 중복 코드 제거
- 객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙) // 외우세요
OOP(Object-oriented prgramming) 객체지향언어의 4가지 핵심
1. 캡슐화
2. 상속
3. 추상화
4. 다형성
클래스와 객체
- 클래스의 정의: 객체를 정의해 놓은 것 ->제품 설계도
- 클래스의 용도: 객체를 생성하는데 사용
- 객체의 정의 : 실제로 존재하는 것, 사물 또는 개념 ->제품
- 객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름
객체의 구성요소 - 속성과 기능
- 객체 = 속성(변수) + 기능(메서드)
객체와 인스턴스
- 객체: 모든 인스턴스를 대표하는 일반적 용어
- 인스턴스: 특정 클래스로부터 생성된 객체
클래스 ---인스턴스화--> 인스턴스(객체)
클래스가 필요한 이유?
-> 객체를 생성하기 위해
객체가 필요한 이유?
-> 객체를 사용하기 위해
객체를 사용한다는 것은?
-> 객체가 가진 속성과 기능을 사용하려고
하나의 소스파일에 여러 클래스 작성
- public class 가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야한다.
- public class가 하나도 없는 경우, 소스파일의 이름은 상관 없음
객체의 생성과 사용
1. 객체의 생성
클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언 --> 리모콘 역할
변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t; //Tv 클래스 타입의 참조변수 t를 선언
t = new tv(); //Tv 인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
2. 객체의 사용
t.channel = 7; // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.
t.channelDown(); // Tv인스턴스 메서드 channelDown()을 호출한다.
System.out.println("현재 채널은 " + t.channel + " 입니다.");
객체의 생성과 사용 - 예제
- 참조변수가 없으면 객체는 사용 불가 -> Garbage Collector 가 제거해간다.
- 하나의 인스턴스를 여러 개의 참조변수가 가르키는 경우 (가능)
- 여러 인스턴스를 하나의 참조변수가 가르키는 경우 (불가능)
class Ex6_1 {
public static void main(String args[]) {
Tv t; // Tv인스턴스를 참조하기 위한 변수 t를 선언
t = new Tv(); // Tv인스턴스를 생성한다.
t.channel = 7; // Tv인스턴스의 멤버 변수 channel의 값을 7로 한다.
t.channelDown(); // Tv인스턴스 메서드 channelDown()을 호출한다.
System.out.println("현재 채널은 " + t.channel + " 입니다..");
}
}
class Tv {
// Tv의 속성(멤버변수)
String color; // 생상
boolean power; // 전원상태(on/off)
int channel; // 채널
// Tv의 기능(메서드)
void power() { power = !power; } // TV를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel; } // TV의 채널을 높이는 기능을 하는 메서드
void channelDown() { --channel; } // TV의 채널을 낮추는 기능을 하는 메서드
}
class Ex6_2 {
public static void main(String args[]) {
Tv t1 = new Tv(); // Tv t1; t1 = new Tv();를 한 문장으로 가능
Tv t2 = new Tv();
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
t1.channel = 7; // channel 값을 7으로 한다.
System.out.println("t1의 channel값은 7로 변경하였습니다.");
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
}
}
객체마다 별도의 저장공간을 가진다.
객체 배열
객체 배열 == 참조변수 배열
클래스의 정의
클래스 == 데이터 + 함수
1. 변수: 하나의 데이터를 저장할 수 있는 공간
2. 배열: 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간
3. 구조체: 서로 관련된 여러 데이터(종류 관계x)를 하나로 저장할 수 있는 공간
4. 클래스: 데이터와 함수의 결합(구조체 +함수)
사용자 정의 타입 - 원하는 타입을 직접 만들 수 있다.
선언 위치에 따른 변수의 종류
cv는 아무때나 사용가능
iv는 객체생성을 해야 사용 가능
lv는 변수 선언문이 수행되었을 때 사용
클래스 변수와 인스턴스 변수
공통 속성은 static 붙인다.
클래스 이름을 cv에 붙인다.
class Ex6_3 {
public static void main(String args[]) {
System.out.println("Card.width = " + Card.width);
System.out.println("Card.height = " + Card.height);
Card c1 = new Card();
c1.kind = "Heart";
c1.number = 7;
Card c2 = new Card();
c2.kind = "Spade";
c2.number = 4;
System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
System.out.println("c1은 width와 height를 각각 50, 80으로 변경합니다.");
c1.width = 50;
c1.height = 80;
System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
}
}
class Card {
String kind;
int number;
static int width = 100;
static int height = 250;
}
메서드란?
1. 문장들을 묶어놓은 것
- 작업 단위로 문장들을 묶어서 이름 붙인 것
2. 값(입력)을 받아서 처리하고 결과을 반환(출력)
매서드의 장점
- 코드의 중복을 줄일 수 있다.
- 코드의 관리가 쉽다.
- 재사용 가능
- 반복적으로 수행되는 여러문장을 메서드로 작성
메서드 = 선언부 + 구현부
반환타입 메서드이름 (타입변수명, 타입변수명, ...)
{
//메서드 호출시 수행될 코드
}
반환타입이 없을 땐 void라고 적는다.
메서드의 구현부
지역변수(lv): 메서드 내에 선언된 변수
메서드의 호출
메서드이름(값1, 값2, ...); // 메서드를 호출하는 방법
print99danAll(); // void print99danAll() 호출
int result = add(3,5); // int add(intx, int y)를 호출하고 결과를 result에 저장
class Ex6_4 {
public static void main(String args[]) {
MyMath mm = new MyMath();
long result1 = mm.add(5L, 3L);
long result2 = mm.subtract(5L, 3L);
long result3 = mm.multiply(5L, 3L);
double result4 = mm.divide(5L, 3L);
System.out.println("add(5L, 3L) = " + result1);
System.out.println("subtract(5L, 3L) = " + result2);
System.out.println("multiply(5L, 3L) = " + result3);
System.out.println("divide(5L, 3L) = " + result4);
}
}
class MyMath {
long add(long a, long b) {
long result = a + b;
return result;
// return a + b; //위의 두 줄을 이와 같이 한 줄로 간단히 할 수 있다.
}
long subtract(long a, long b) { return a - b; }
long multiply(long a, long b) { return a * b; }
double divide(double a, double b) {
return a / b;
}
}
메서드의 실행흐름
'Java > 자바의 정석' 카테고리의 다른 글
남궁성 자바의 정석 기초편 ch 6 오버로딩 생성자 초기화 (0) | 2022.11.22 |
---|---|
남궁성 자바의 정석 기초편 ch 6 return문 호출스택 매개변수 static 메서드 인스턴스 메서드 (0) | 2022.11.21 |
남궁성 자바의 정석 기초편 ch 5 배열 (0) | 2022.11.21 |
남궁성 자바의 정석 기초편 ch 4 조건문과 반복문 (0) | 2022.11.20 |
남궁성 자바의 정석 기초편 ch 3 (0) | 2022.11.19 |