1. 객체지향 프로그램
(1) 객체지향 프로그램(OOP : Object-Oriented-Programming)
- 모든 데이터를 오브젝트로 취급하여 프로그래밍 하는 방법으로, 처리 요구를 받은 객체가 자기 자신의 안에 있는 내용을 가지고 처리하는 방식
- C, Pascal, Basic 등과 같은 절차형 언어(POP : procedure-oriented-programming)가 크고 복잡한 프로그램을 구축하기 어렵다는 문제점을 해결하기 위해 탄생
(2) 객체지향 프로그래밍의 특징
|
자료추상화 |
상속 |
캡슐화 |
다형성 |
설명 |
불필요한 정보는 숨기고 중요한 정보만을 표현하는 것 |
새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 것 |
데이터(속성)와 데이터를 처리하는 함수를 하나로 묶는것 |
어떤 한요소에 여러 개념을 넣어 놓는 것 |
특징 |
객체의 속성들 중에서 가장 필요한 정보들만 간추려 구성하여 복잡한 문제를 다룰때 사용함 |
상위 클래스의 모든 속성과 연산을 물려받아 자신의 속성으로 사용이 가능함 |
객체가 갖고 있는 속성과 데이터를 숨기며, 연산만을 이용해 접근을 허용함 |
한 가지 형태로 여러가지 기능을 수행할 수 있게 하여 함수와 변수를 상황에 따라 사용할 수 있게 함 |
장점 |
유사모델을 만들어 테스트하기 좋고 시스템의 구조 및 구성을 알아보기 좋음 |
상위와 하위 클래스의 공유로 인해 코드 및 프로그램 재사용율이 증가 |
각 객체의 데이터가 외부에 은폐 되어있어 오류 발생이 적음.(정보은닉) |
같은 이름의 함수를 여러개 정의하고 매개 변수나 타입만을 다르게 호출하는 것이 가능함 |
2. 클래스와 객체
(1) 객체(object) = 인스턴스(instance)
- 서로 다른 많은 데이터를 하나로 묶어서 표현한 것
- 객체 : 실제로 존재하는 것, 사물 또는 개념
- 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
(2) 클래스(class)
(3) 클래스를 사용하는 이유
- 코드의 재사용성 : 새로운 코드를 작성할 때 기존의 코드를 이용
- 코드의 가독성/확장성이 높아짐
- 변수나 데이터의 관리나 접근성이 높아짐
- 신뢰성 높은 프로그래밍 : 제어자와 메소드를 사용해서 데이터를 보호
(4) 클래스의 정의와 객체 생성
- 클래스 정의 : 클래스를 작성하는 것
- class 키워드로 클래스를 정의
- 클래스 이름은 Upper Camel Case 규칙을 따름
class 클래스명{
본문
}
class Car{ // 클래스 정의
// 클래스 안에서 변수를 생성
boolean powerOn;
String colorString;
int wheel;
int speed;
boolean wiperOn;
}
종류 |
예시 |
특징 |
Snake Case |
my_best_friend |
언더바(_)로 연결 |
Lower Camel Case |
myBestFriend |
첫글자는 소문자 |
Upper Camel Case |
MyBestFriend |
첫글자도 대문자 |
(5) 클래스의 정의와 객체 생성
클래스명 객체 = new 클래스명();
클래스명 객체1 = new 클래스명();
클래스명 객체2 = new 클래스명();
객체명.변수명
객체명.메소드명()
class Car{
boolean powerOn;
String color;
int wheel;
int speed;
boolean wiperOn;
}
public class Test {
public static void main(String[] args){
// Car클래스의 객체 생성
Car my_Car1 = new Car();
Car my_Car2 = new Car();
// my_Car1 객체의 변수 출력
System.out.println(my_Car1.color);
// my_Car1 객체의 변수에 값을 저장
my_Car1.color = "red";
my_Car2.color = "blue";
System.out.println(my_Car1.color);
}
}
3. 메소드
(1) 메소드
- 특정 객체/데이터 자료형이 가지고 있는 함수
- 데이터와 멤버 변수에 대한 접근 권한을 가짐
- 특정한 직업이나 논리를 구성하는 코드를 괄호로 묶어 놓은것
- 입력 값을 받아서 내부에서 처리하여 결과를 출력/반환
(2) 메소드 호출방식
- 특정 객체를 통해서만 호출가능
- 객체 + '.'(마침표)를 통해 호출가능
- 예시
ArrayList <Integer> my_list = new ArrayList<>();
my_list.add(3);
my_list.clear();
4. 사용자 메소드
(1) 사용자 메소드(사용자 함수)
- 사용자 직접 만든 함수
- 내장함수 외의 기능 혹은 자신이 원하는 기능을 작성
- 구성요소
- 인수 : 사용자 함수에 전달할 입력(input) argument라고도 함
- 매개변수 : 인수를 받아서 저장하는 변수 parameter라고도 함
- 반환값 : 사용자 함수의 출력(output) return이라고도 함
(2) 사용자 메소드의 정의
- return문은 반환 값이 없을 경우에는 작성하지 않음
- 메소드의 반환타입이 void일 경우를 제외하고는 반드시 메소드 내부에 return문이 있어야 함
- 메소드 이름은 사용자가 지정
반환타입 메소드명(자료형 매개변수, 자료형 매개변수, ....){
본문
retuen 반환값;
}
(3) 메소드 호출
참조변수.메소드명(인수);
// 인수가 있고 반환값이 없는 경우
class Houes{
void welcome{
System.out.println("Hello Java!");
}
}
public class Test{
public static void main(String[] args){
House my_house = new House();
my_house.welcome();
}
}
(4) 인수와 매개변수
- 함수로 전달되는 인수를 저장하는 변수를 매개변수라고 함
- 예시
class Preson{
// 메소드 정의
void introduce(String name, int age){
System.out.println("내 이름은 " + name);
System.out.println("나이는 " + age);
}
}
public class Test{
public static void main(String[] args){
// 객체 생성
Person new_person = new Person();
// 인수를 매개 변수로 전달
// introduce 함수 실행
new_person.introduce("james", 25);
}
}
(5) 반환값
- 메소드의 결과 값을 돌려주는 것을 반환이라고 함
- return을 만나면 즉시 함수를 빠져나옴
class Person{
String address(){
String str = "우편번호 12345\n";
str += "대구시 중구 반월당";
return str;
}
}
public class Test{
public static void main(String[] args){
Person new_person = new Person();
// address 함수에 반환값을 str이 반환
System.out.println(new_person.address());
}
}
(6) 함수의 종료를 위한 return
- 값을 반환하지않고 함수가 종료
- 함수의 특정부분에서 함수를 빠져나오고 싶을 때 사용
- 예시
class Energy{
void charge(int energy){
if(energy < 0){
System.out.println("0 보다 작은 에너지는 충전 불가능");
return;
}
System.out.println("에너지가 충전됨");
}
}
public class Test{
public static void main(String[] args){
Energy charger = new Energy();
charger.charge(1);
charger.charge(-1);
}
}
5. 클래스의 구성
(1) 인스턴스 변수와 인스턴스 메소드
- 인스턴스 변수
- 클래스를 기반으로 만들어지는 모든 인스턴스들이 각각 따로 저장하는 변수
- 객체마다 가지는 고유한 변수
- 인스턴스를 생성할 때 만들어짐
- 인스턴스마다 다른 값을 가져야 할 경우 인스턴스 변수로 선언
- 인스턴스 메소드
- 객체를 생성해야 호출이 가능한 메소드
- 객체가 생성되어야 메모리에 올라감
- 메소드 앞에 static이 붙어있지 않음
- 예시
class Car {
int speed = 0;
void speed_up(){
speed++;
}
}
public class Test{
public static void main(String[] args){
Car car1 = new Car();
Car car2 = new Car();
car1.speed_up();
car2.speed_up();
}
}
(2) 클래스 변수와 클래스 메소드
- 클래스 변수
- 모든 인스턴스가 동일한 값을 사용할 때 정의함
- 모든 인스턴스들이 공유하도록 처리
- 메모리 공간을 절약할 수 있음
- 클래스가 처음 메모리에 로딩될 때 생성
- 변수 선언시 static 키워드를 사용
- 클래스 메소드
- 객체를 생성하지 않아도 호출이 가능
- 메소드 선언시 static 키워드를 사용
- 예시
class Car{
// 클래스 변수
static int speed = 0;
// 클래스 메소드
static void speed_up(){
speed++;
System.out.println(speed);
}
}
public class Test{
public static void main(String[] args){
// Car 객체 생성
Car car1 = new Car();
Car car2 = new Car();
// Car 객체에서 speed_up 호출
car1.speed_up();
car2.speed_up();
// 클래스에서 바로 변수명과 메소드명으로 호출
Car.speed++;
Car.speed_up();
}
}