22.02.03 JAVA 객체지향(OOP)

최고고·2022년 2월 3일
0
post-custom-banner

객체 지향 프로그래밍 (Object Oriented programming)

-절차지향(장점 소규모에는 좋다)과 상반되는 개념
-각 기능을 객체라는 형태로 나눠서 메시지를 주고 받으며 기능을 수행
-여러개의 독립된 단위
-객체들의 집합
-신뢰성있는 sw 작성, 코드 직관적, sw의 생산성 향상, 유지보수에 용이

  • 추상화(abstract)
    객체에서 공통된 속성과 행위를 추출
    필요한 정보들만 간추려 구성
    구현(로직) 제외 선언들 설계
  • 캡슐화(encapsulation)
    실제 구현 내용을 외부로부터 정보를 은닉/ 외부에서는 공개된 메소드 인터페이스를 통해 접근할 수 있다.
  • 상속(inheritance)
    이미 작성된 클래스(상위클래스)의 속성을 그대로이어받아 새로운 클래스(하위클래스)를 생성
    기존코드 재사용 재정의 => 재사용 + 확장의 의미
  • 다형성(polymorphism)
    같은 메소드를 호출하더라도 객체마다 다르게 작동
    기존클래스를 재정의 하여 사용하는 것도 다형성 ex)오버라이딩

클래스

-객체만들기위한 틀, 설계도(blueprint, definition, ,description) 자료형
-클래스에 설계 후 객체 생성가능
-클래스 구조 : 데이터를 저장할 수 있는 속성-필드 field 와 기능(logic)을 담아 행동을 정의하는 (method)으로 나뉘어져있다.

객체(object) 생성 = 변수

클래스명 변수명 = new 클래스명();
-created from the class 클래스를 통해 정의됨
-공통된 속성과 행위를 추출하는 기법
-필요한 정보들만 간추려서 구성
-로직부분 제외
-객체 생성 후 메소드 기능 호출할 때는 캡슐화 때문에 직접 필드에 접근하기 보다 메소드를 통해 접근하는게 좋다. <데이터 보호 가능> -> 필드 바로 접근은 조건,오류,버그 방지 안되기 때문
-객체의 필드에 아무것도 넣지 않으면 레퍼런스변수 - null, 기본자료형은 0, false

-getter(리턴있음) setter method (데이터를 넣고 꺼내는 메소드 ) : 자바의 기본 기능이 설정되어있음. alt + shift + s => general getters and setters - > 생성되길 원하는 필드 체크하고 확인!

package exam01; //폴더단위로 묶어서 클래스를 관리할수있다.

public class Bank {
	//필드 (속성)-데이터 저장공간
	private int money; //금액을 저장하는 필드
	//같은 클래스 내에서만 사용가능하게 접근제한자 줌. 데이터 보호
	//메소드 사용 이유: 
	//메소드(기능) - 데이터를 가지고 뭔가 작동하는 것
	
	//입금기능
	public void deposit(int money) {
		this.money += money;		
		//매개변수, 입력변수도 똑같이 쓸수있지만 색이 똑같이 나옴 
		//변수명이 파란색이어야 필드  ->this. 써주면 현재 클래스의 필드변수를 지칭한다
		//장점 : 1.객체에서 자동완성쓸때 직관적으로 알 수 있다. 2.변수명하나로 맞출수있다.
		
	}
	//잔액보기
	public int showMoney() {
		return money;	//매개변수가 없어서 상관없다.
	}
	//출금기능
	public void withdraw(int outputMoney) {
		money -= outputMoney;
		
	}
	
}

생성자(constructor)

-객체생성될때 자동으로 호출되는 특별한 메소드
객체의주소 객체명 = new 생성자(); new를 통해 객체를 생성할 때만 호출됨

기본 생성자 : 디폴트 생성자

-사용자가 생성자를 만들지않아도 컴바일러가 자동으로 만들어줌
-해당 클래스이름과 동일하다
-리턴타입 없음
-객체를 생성할 때 반드시 호출됨

사용자 정의 생성자 : 사용자가 필요에 의해 다시 정의한 생성자 - 강제성 부여 - 오버로딩

-기본생성자에 매개변수를 넣어주면 그 필드의 변수는 무조건 입력되어야함
-매개변수를 받아서 필드에 채워줘야됨
public Cycle (int a, int b, String c){
this.a(필드) = a; this.b = b; this.c = c;
}
단축키 alt shift s => generate constructor using fields => 필드체크

메소드 오버로딩 : 중복정의

-동일한 이름의 메소드를 사용하는방법
-둘 중 하나의 조건만 만족하면 동일한 이름의 메소드를 만들 수 있다.
1. 매개변수의 개수가 다를 때 2. 매개변수의 데이터 타입이 다를 때

  • 여러개 객체를 하나로 묶어서 보관 하는 법
  1. 배열의 형태
    객체(변수)명 [] 배열이름 = {미리 정의한 객체명1,객체명2,...};
  2. ArrayList (가변성있어서 주로 사용)

예제

import java.util.Scanner;
public class Main2 {
	public static void main(String[] args) {
	Student hrj = new Student("황", "39332", 99, 87, 68);
	Student ljn = new Student("이", "1434", 23, 84, 68);
	Student pjs = new Student("박", "2342", 23, 57, 88);

Student[] list = { hrj, ljn, pjs };
Scanner sc = new Scanner(System.in);
	while (true) {
	System.out.print("1. 전체이름 보기 2.조회 3.종료 >> ");
	int choice = sc.nextInt();
	if (choice == 1) {
	System.out.println("===전체이름보기===");
	for (int i = 0; i < list.length; i++) {
		System.out.println(list[i].getName());
	}
}				

// 이름 입력받고 이름과 일치하는 사람의 이름,학번,평균출력
	else if (choice == 2) {
	System.out.println("==조회==");
	System.out.print("조회할 사람의 이름 입력 : ");
	String name = sc.next();
	boolean ck = true; //   기본값을 true 해주고
	for (int i = 0; i < list.length; i++) {
		if (name.equals(list[i].getName())) {
        System.out.println(list[i].getName() + "-" + list[i].getStuid() + "-" + list[i].getScore());
		ck = false;  // 이 if 문을 지나가면 false를 true로 변경 해야됨
		}
     }
// for문안에서 else를 하면  해당안되는 그 외 값i를 else가 받아서 출력하게됨 
for문 다 끝나고나서 출력해야됨
	
	if (ck) { //ck가 true 일때
	System.out.println("일치하는 이름이 없습니다."); 
	}
// 만약 ck가 true라면 if문을 안지나갔으니까 이름을 못찾았다는 얘기잖아요?
	}

else if (choice == 3) {
	System.out.println("프로그램 종료됩니다");
		break;
	}

else {
	System.out.println("정확한 숫자를 입력해주세요");
	}

	}
}
}
post-custom-banner

0개의 댓글