JAVA

[JAVA]객체지향 프로그래밍

로돌씨 2024. 2. 19. 01:09

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

어떤 데이터를 입력받아 순서대로 처리하고 결과 도출하는 명령어들을 독립적인 부품들의 조합처럼 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍

장점 :

  • 프로그램을 유연하고 변경에 용이하게끔 만듦(필요한 부분만 교체하고 나머지 부품을 건드리지않아도 되는것처럼)
  • 잘 설계된 객체지향 코드는 각각의 독립적역할을 가지기때문에 문제가 생긴 코드만 수정하면 되기에 코드의 변경을 최소화하고 유지보수를 하기에 유리함
  • 반복적인 코드를 최소화 시키고 코드를 간결하게 표현 할 수 있게함.

객체지향 프로그랭의 4가지 특징

  • 추상화
  • 상속
  • 다형성
  • 캡슐화

캡슐화?

서로연관있는 속성과 기능들을 하나의 캡슐로 만들어 외부로부터 보호함!

		package com.test.chapter01_encapsulation;
public class Account { // 캡슐화
	// 1. 필드
	private String name = "박로돌";
	private String accNo = "010-3335-XXXX";
	private String pw = "1234";
	private int balance = 0; 
	//private 를 이용해외부 클래스에서 함부로 접근하지 못하게 적용함
	
	// 금액 
	
	
	// 2. 메소드
	// 생성자(객체를 생성하기 위한 일종의 메소드) 
	public Account() {}
		//void 가없음 -> return 타입이 없음
		//입금
	public void in(int money) {
			if ( money > 0) {
				balance += money ;
				System.out.println( name + "님의 계좌에 "  + money+"원이 입금되었습니다." );
			}else { 
				System.out.println("잘못 입력되었습니다.");
			}
		}
	//출금 
	public void out(int money) {
		if ( money < balance ) {
			balance -= money;
			System.out.println(money +"원이 출금 되었습니다. ");
		}else {
			System.out.println("출금하려는 금액이 보유한 금액보다 많습니다. ");
		}
	}
	//잔액조회
public void displayBalance() {
	System.out.println(name + "님의 잔액은 "+ balance +"원 입니다. ");
}
	
	
	
	}

 

package com.test.chapter01_encapsulation;

public class Mtest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Account At = new Account();
		// 잔액조회
		At.displayBalance();
		// 입금
		At.in(100);
		At.displayBalance();
		At.in(250);
		At.displayBalance();
		// 실행명.기능명(매개변수값);
		//출금 
		At.out(300);
		At.displayBalance();
		At.out(100);
		//누가 갑자기 입출금 기능 무시하고 전액 인출 
		// At.balance -= 200; (private 를 적용하니 빨간줄이 그임) 
		// 함부로 접근해서는 안되는 곳에 적용
		Account Bt = new Account ();
		Bt.in(100);
		Bt.displayBalance();
		//Bt가 가르키는 객체와 달라서 0원부터 적용되어 잔액이 100원으로 표기됨
		
		}

예제)

 

더보기

default접근제한자

package com.test.chapter02_Class.defaultClass.model;

/* public */ class DefaultClassTest {
//퍼블릭이 없으면 디폴트 클래스임 
	public void test() {
		System.out.println("default 클래스 내의 test()호출됨 .. ");
	}
}

예제

package com.test.chapter02_Class.defaultClass.model;
import com.test.chapter02_Class.defaultClass.model.*;
public class Run {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
//DefaultClassTest클래스 객체 생성 후test()실행
		DefaultClassTest D = new DefaultClassTest();
		D.test();
		//not visible 디포트 클래스는 해당패키지 제외한 외부에서는 접근이 불가능!
		//같은 패키지로 복사하니 정상적으로 실행이 되는 모습
		
	}

}

실행문

package com.test.chapter02_Class.defaultClass.run;
import com.test.chapter02_Class.defaultClass.model.*;
public class Run {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
//DefaultClassTest클래스 객체 생성 후test()실행
		//DefaultClassTest D = new DefaultClassTest();
		//not visible 디포트 클래스는 해당패키지 제외한 외부에서는 접근이 불가능!
		
	}

} 아예 실행이 되지않음

다른 패키지에서의 실행문

 

더보기

public 접근제한자

package com.test.chapter02_Class.publicClass.model;

public class PublicClassTest {

	public void test() {
		System.out.println("public클래스에서 호출됨 ..");
	}
}
package com.test.chapter02_Class.publicClass.run;
import com.test.chapter02_Class.publicClass.model.*;
public class Run {
	public static void main(String[] args) {
		PublicClassTest D = new PublicClassTest();
		D.test();
	}
}

→ 퍼블릭 클래스이기 때문에 임포트를 통해 다른패키지에서도 호출이 가능하다.

필드 (지역변수와 전역변수)

package com.test.chapter03_field.test01;

//변수 선언 위치에 따른 구분
public class KindsOfVariable { // 클래스 영역의 시작
	// 클래스 영역에작성하는 변수를 필드
	// 필드 == 멤버변수 (클래스가 가지는 멤버라는 의미)==전역변수(클래스 전체에서 사용할수있는 변수)
	private int globalNum;

	public void testMethod(int num) {// 메소드 영역의 시작
		// 메소드 영역에서 작성하는 변수를 지역변수.
		// 메소드의 괄호 안에 선언하는 변수를 매개변수(매개변수 또한 지역변수)

		int localNum;

		System.out.println(num);
		// System.out.println(localnum); -> 에러남 .
		// 지역변수는 선언외에 다시 사용하기위해서는 반드시 ! 초기화가 되어야 한다.
		System.out.println(globalNum);
		// 필드변수는 사용가능

	}

	public void testMethod2() {
		// System.out.print(localNum); -> 에러 . 지역변수는 해당 블럭 내에서만 사용가능
		System.out.print(globalNum); //역시 사용가능한 모습
	}// 메소드 영역의 끝
}// 클래스 영역의 끝

 

더보기

Static을 이용한 지역변수, 전역변수

package com.test.chapter03_field.test01;

//static 
public class KindsOfVariable02 {

	// 전역 변수에서 static 키워드사용가능
public static int staticNum;
//접근제한자 = 퍼블릭 스태틱 , 파이널같이쓰는것을 상수필드라고 함
public static final int static_num = 1;
//변하지 않는 값, 상수필드는 선언과 동시에 초기화 되어야한다. 
//프로그램 시작시값이 저장되면 변경하지않고 지속적으로 사용할 목적으로 사용.
public final static int static_num2 = 1;
//예약어와 스태틱 위치를 바꿔도 실행되는 모습

public void methodTest() {
	// static int localStaticNum = 1; -> 에러남 final 만 붙일수있다는 에러메세지
	//지역변수에서는 스태틱 사용 불가능

}


}

초기화 블럭

//초기화 블럭
public class InitBlock {
	// 필드를 초기화 하지않으면 기본값으로 객체가 초기화 되면서 생성 .
	// 1. jvm 기본값 초기화
	// private String name;
	// private int price;
	// private static String brand;

	// -> 값은 null , 0 , null

	// 2. 명시적 초기화
	private String name = "아이폰";
	private int price = 1700000;
	private static String brand = "apple";
	// 선언과 동시에 값을 지정하여 초기화 시켜줌
	// -> 출력 값 : 아이폰,1700000,apple

	// 3.초기화 블럭 이용
	{
		name = "갤럭시";
		price = 1200000;
		brand = "삼성";
	}

	static {
		//name = "플립";
		//price = 1500000;
		//static 초기화 블럭에서는 non static 필드 초기화 불가능 
		brand = "samsung";
		//스태틱 
	}

	public InitBlock() {} // 생성자
	
	//4. 매개변수가 있는 생성자 
	//위의 초기화되는 값을 다 덮어쓰고 전달받은 값으로 초기화 진행.
	public InitBlock(String name , int price , String brand) {
		this.name = name ;
		this.price = price;
		InitBlock.brand = brand;
		//클래스명.변수 = 변수 ; <- 이렇게하는게 바람직
		
	}
	public String getName() {
		return name;
		// 필드의 name값을 가져옴
	}

	public void setName(String name) {
		this.name = name;
		// name값을 받아서 필드네임값에 저장을 하겠다 .
	}

	public void information() {
		System.out.println(name + "," + price + "," + brand);
	}

}

예제

package com.test.chapter03_field.test02;

public class Run {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
InitBlock b = new InitBlock () ;
b.information();

//매개변수가 있는 생성자실행문
InitBlock b2 = new InitBlock("폴더",2500000,"SAMASUNG");
b2.information();
b2.setName("푸하하하항");
b2.information();
	}

}
출력값 ->
갤럭시,1200000,삼성
폴더,2500000,SAMASUNG
푸하하하항,2500000,SAMASUNG

출력문

 

생성자 Constructor

public class User {

	private String userId;
	private String userPwd;
	private String userName;
	private Date date;

//생성자의 사용목적
//1. 객체를 생성해 주기위한 목적
//2. 매개변수로 전달받은 값으로 필드를초기화 할 목적

//기본생성자 -> 필드의 초기화 역할은 수행하지 못하고 객체만 생성할 때 사용.
	public User() {
	}

	// 매개변수 있는 생성자 -> 객체생성과 필드 초기화.
	// 같은 이름의 생성자 또는 메소드를 사용하려면 오버로딩을 사용해야한다.
	public User(String userId, String userPwd, String userName) {
		// 오버로딩을 사용하여 같은 메소드명임에도 빨간줄이 안그임
		// this. 은 메소드 내에 숨겨진 채 존재하는 레퍼런스변수 , 할당된 객체의 주소
		//
		this.userId = userId;
		this.userPwd = userPwd;
		this.userName = userName;

	}

	public User(String userId, String userPwd, String userName, Date date) {
		// 오버로딩을 사용하여 같은 메소드명임에도 빨간줄이 안그임
		// this. 은 메소드 내에 숨겨진 채 존재하는 레퍼런스변수 , 할당된 객체의 주소
		//
		// this.userId = userId;
		// this.userPwd = userPwd;
		// this.userName = userName;

		this(userId, userPwd, userName); // 이렇게도 사용 가능 (맨 위에있어야함)
		this.date = date;
	}

	// getter & setter 가 기본적으로 따라옴 get -> 값 가져옴 / set -> 값 세팅함
	public String getUserId() {
		return userId;
	}

	public String getUserPwd() {
		return userPwd;

	}

	public String getUserName() {
		return userName;
	}

	public Date Date() {
		return date;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public void setUserPwd(String userPwd) {
		this.userPwd = userPwd;
	}

	public void setUserName(String userName) {

		this.userName = userName;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	// 필드값 전체 출력용 메소드
	public void information() {
		System.out.println(userId + "," + userPwd + "," + userName + "," + date);
	}

}

 

예제

package com.test.chapter04_constructor.run;

import com.test.chapter04_constructor.model.*;
import java.util.Date;

public class Run {
	public static void main(String[] args) {

		User u1 = new User(); // 기본생성자
		u1.information();
		// User u2 = new User("user01", "pass01", "박영석"); // 매개변수 생성자
		// u2.information();
		User u3 = new User("user01", "pass01", "박영석");
		u3.information();
		User u4 = new User("user01", "pass01", "박영석", new Date());
		u4.information();
//매개변수 갯수 , 타입에 맞춰 작성
	}

}
-> 출력값 : 
null,null,null,null
user01,pass01,박영석,null
user01,pass01,박영석,Mon Feb 27 18:11:35 KST 2023

출력문

 

Overloading

public class OverLoadingTest {
//같은 클래스 내부에서 같은 이름의 메소드를 여러개 쓰는 구문
	public int test() {
		System.out.println("String");
		return 0;
	}

	public int test(int a) { // 같은 이름에도 사용가능한 모습 (매개변수값을 지정해줬기떄문에 )
		// ol.test(a); 로 실행
		return 0;
	}

	public int test(int a, int b) { // ol.test(a, b);로 실행
		return 0;
	}

	public int test(int a, String b) {// 같은 수 지만 타입이 다르기때문에 에러 x
		return 0;
	}
	
	 /* public int test(int b , int a) { return 0 ; } 에러발생, 
	 * 매개변수명은 상관없이 자료형의 갯수와 순서가 다르게 작성되어야한다.
	 */
	public int test(String b,int a) {
		return 0; //자료형의 순서가 달라 에러 x 
	}
	/*public String test(int a , int b , String str) {
		return null;
	}
	public int test(int a , int b ,String str) {
		return 0; // -> 에러 , 리턴타입이 다르다고 오버로딩이 적용되는건 아님
	}
	*/
/*private String test(int a , int b ,String str) {
	return null;  -> 에러 , 접근제한자가 다르다고 오버로딩이 적용되는건 아님
	*/ 
}

 

'JAVA' 카테고리의 다른 글

[JAVA]객체#3  (0) 2024.02.21
[JAVA]객체#2  (0) 2024.02.20
[JAVA]배열  (0) 2024.02.14
[JAVA]조건문  (1) 2024.02.13
[JAVA]제어문  (0) 2024.02.08