- 자바에서 생성되는 프로그램의 최소 단위
- 기능(메소드)과 속성(멤버변수)로 구성
- 사용자 정의 자료타입
- 데이터와 기능을 함께 저장할 수 있는 자료구조
객체 지향 프로그래밍 OOP( Object Oriented Programming)
- 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것
객체 지향 프로그래밍의 특징
추상화
- 추상화의 사전적 의미는 특정한 개별 사물과 관련되지 않은 공통된 속성이나 관계 등을 뽑아내는 것
- 공통의 속성이나 기능을 묶어 이름을 붙이는 것으로 객체 지향적 관점에서 클래스를 정의하는 것
- 예를 들어, 토끼, 고양이, 사자, 치타가 있을 때 이것들을 각각의 객체라 하며 이 객체들을 하나로 묶으려 할 때 동물 또는 생물이라고 묶는 것
- 자바에서 추상화란 메소드(기능)와 멤버변수(속성)로 클래스를 만드는 것(설계도, 부모클래스)
- 자바에서 추상클래스라는 용어는 완성되지 않은 클래스(미완성 설계도)
상속 - 재사용
- 추상화한 클래스(부모클래스)에 각각의 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미
- 부모클래스에 정의된 기능은 새로 만들 않아도 사용 가능(재사용)
- 자바에서는 다중 상속이 되지 않음
캡슐화, 은닉화
- 캡슐화는 실제로 구현되는 부분을 외부에 드러나지 않도록 캡슐로 감싸 이용방법만을 알려주는것
- 은닉화는 내부 데이터, 내부 연산을 외부에서 접근하지 못하도록 은닉(hiding) 혹은 격리(isolation)시키는 것
- 변수에 접근지정자를 private 로 지정
- setter , getter 를 사용해 변수의 접근, 제어
다형성
- 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미
- 자바에서는 부모의 클래스형으로 자식의 클래스형를 참조
- 부모의 클래스를 자식이 오버라이딩 했을 경우 부모의 형으로 자식을 참조하면 자식의 메소드가 실행됨
- 상속, 인터페이스 구현된 클래스에서 메소드의 인자 전달등에서 다형성이 많이 활용됨
클래스와 인스턴스(instance)
클래스
- 어떤 문제를 해결하기 위한 데이터를 만들기기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것
인스턴스(화)
- 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용
- 참조변수 : new 로 생성된 인스턴스의 주소를 할당 받은 변수
클래스 모델링 및 설계
모델링
- 클래스의 속성과 기능을 도출하는 단계
- 특성(속성) : 클래스를 특징 지울 수 있는 성질
- 기능 : 객체가 할 수 있는 행위
설계
- 특정 클래스를 정의 하는 것
- 설계도면을 작성하는 것과 같은 개념
클래스 기본 구성
접근자 class 클래스이름 {
변수; // 속성, 데이터 필드
생성자(); // 기본생성자 - 생략가능
메서드();// 기능
}
클래스 생성
package chapter07;
public class Member {
}
클래스 사용
- . 을 통해 속성, 메서드 접근
package chapter07;
public class MemberMain {
public static void main(String[] args) {
Member m = new Member();
Member m2 = new Member();
if (m == m2) {
System.out.println("m개체와 m2객체는 같다.");
} else {
System.out.println("m개체와 m2객체는 같지 않다.");
}
}
}
Car클래스 생성 및 사용
생성
package chapter07;
public class Car {
// 필드
String color;
String company;
String type;
// 메서드
public void go() {
System.out.println("전진하다.");
}
public void back() {
System.out.println("후진하다.");
}
}
사용
package chapter07;
public class CarMain {
public static void main(String[] args) {
Car tico = new Car();
Car pride = new Car();
tico.color = "화이트";
tico.company = "현대";
tico.type = "경차";
pride.color = "블랙";
pride.company = "기아";
pride.type = "소형";
tico.go();
pride.go();
System.out.println(tico.color);
System.out.println(tico.company);
System.out.println(tico.type);
System.out.println(pride.color);
System.out.println(pride.company);
System.out.println(pride.type);
}
}
Car클래스 배열에 저장 사용
package chapter07;
public class CarMain2 {
public static void main(String[] args) {
// Car 타입의 배열객체 생성
Car[] cars = new Car[2];
Car tico = new Car();
Car pride = new Car();
tico.color = "화이트";
tico.company = "대우";
tico.type = "경차";
cars[0] = tico;
pride.color = "블랙";
pride.company = "기아";
pride.type = "소형";
cars[0] = pride;
System.out.println("0번 인덱스 color : "+cars[0].color);
System.out.println("1번 인덱스 color : "+cars[1].color);
cars[0].color = "블랙"; // 0번 인덱스 객체의 color 필드에 "블랙" 대입
System.out.println("0번 인덱스 color : "+cars[0].color);
System.out.println("1번 인덱스 color : "+cars[1].color);
for(Car car : cars){
System.out.println(car.color);
}
}
}
데이터 필드
- 인스턴스 생성시 속성이나 상태값을 저장하는 곳
- 멤버변수 : 클래스변수와 인스턴스변수로 구분
변수 구분
- 멤버변수와 지역변수로 구분
클래스변수 - 스태틱(static),전역(global) 변수
- 클래스가 로드될 때 Class Arae의 Static 영역에 생성
- 객체 생성 없이 클래스이름으로 바로 참조 가능
- 변수 선언시 static 키워드 사용
인스턴스 변수 - 필드, 멤버변수
- static 없는 변수
- 객체가 생성 될 때 (new) 자동 초기화
- 힙(heap) 영역에 생성 됨
데이터 타입기본값
정수 타입 | 0 |
실수 타입 | 0.0 |
문자 타입 | '\U0000' |
boolean | false |
참조형 | null |
로컬, 지역(local) 변수
- 멤버변수가 아니면 모두 로컬 변수
- 메소드나 실행블럭, 제어문 블럭, 초기화 블럭 안에 정의 된 변수
- 블럭 밖에서 사용 불가
- 스택(Stack)에 생성되면 메소드 실행 종료 시 자동 소멸
- 자동 초기화 되지 않음
지역변수 범위 scope
package chapter07;
public class LocalVarTest {
public static void main(String[] args) {
int n = 0;
{
int a = 10;
}
// int b = a; // error 블럭에서 선언된 a 지역변수
for(int i=0; i<3; i++) {
int j = 3;
}
// int b = i; error for() 선언된 i, for블럭에 선언된 j 지역변수
}
public static void nUse() {
//int k = n; // main()에 선언된 n 지역변수
}
}
클래스변수, 인스턴스변수 범위
package chapter07;
class Avante {
static String company = "현대"; // 클래스 변수
String color; // 인스턴스 변수
}
public class VarEx {
public static void main(String[] args) {
// 클래스 변수 사용
System.out.println("Avante 제조사 : "+Avante.company);
Avante a1 = new Avante();
Avante a2 = new Avante();
// 인스턴스 변수의 값 변경
a1.color = "화이트";
a2.color = "블랙";
// 인스턴스 변수 출력
System.out.println("a1 색상 : "+a1.color);
System.out.println("a2 색상 : "+a2.color);
// 클래스 변수를 인스턴스 객체로 출력
System.out.println("a1 제조사 : "+a1.company);
System.out.println("a2 제조사 : "+a2.company);
// 클래스 변수의 값 변경
a1.company = "기아";
// 클래스 변수의 값 변경 후 클래스변수와 인스턴스변수 출력
System.out.println("Avante 제조사 : "+Avante.company);
System.out.println("a1 제조사 : "+a1.company);
System.out.println("a2 제조사 : "+a2.company);
}
}
클래스변수, 인스턴스변수, 지역변수 범위
package chapter07;
class Local {
String name;
void process() {
name = "홍길동";
}
void printAge1() {
int age = 20; // 지역변수
System.out.println(age);
}
void printAge2() {
int age = 30; // 지역변수
System.out.println(age);
}
}
public class LocalValEx {
public static void main(String[] args) {
Local local = new Local();
System.out.println(local.name); // null
local.process();
System.out.println(local.name); // 홍길동
local.printAge1();
local.printAge2();
// for문 블록 내에서의 변수 선언
for (int i=0; i<10; i++) {
int temp = 0;
temp += i;
}
//System.out.println(temp); // 에러
}
}
'Programing > JAVA' 카테고리의 다른 글
클래스 CLASS_Part3 (0) | 2022.03.02 |
---|---|
클래스 CLASS_Part2 (0) | 2022.03.02 |
배열 ARRAY (2) | 2022.02.28 |
함수 - 메서드 FUNCTION (0) | 2022.02.24 |
제어문 - 반복문 LOOP (1) | 2022.02.23 |