객체지향 프로그래밍(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 |