본문 바로가기
☁︎KOSTA/☂︎KOSTA-JAVA

[KOSTA] Spring 기반 Cloud 서비스 구현 개발자 양성 (Day 2) - OOP, Object, Class, 속성/기능, class/variable/method 문법, 접근제어자

by 하_센세 2022. 7. 28.

2022.07.28 [THU]

- Day 2 - 

 

수업 주요 목차

  •  OOP 객체 지향 프로그래밍
  • 객체(object)
  • 클래스(class)
  • 속성 (attribute or variable
  • 기능 (operation or method)
  • class, variable, method 문법
  • 접근제어자(access modifier)

 


 

 - 자바 언어의 특징

  1. 객체 지향 언어이다.
  2. 플랫폼 독립적이다. -> 운영체제와 관계없이 한번 작성한 자바 프로그램은 어디서나 동일한 동작을 한다.(운영체제별 JVM이 설치되기 때문) => "Write Once, Run Anywhere"
  3. 자동 메모리 관리 (JVM이 담당 => GC : Garbage collection(필요없는 정보를 제거))

   

   

 - 소프트웨어 개발 생명 주기 (SDLC : Software Development Life Cycle)

  요구분석 -> 설계 -> 구현 -> 테스트 -> 운영(유지보수)

 

 

 - 소프트웨어 개발 방법론

  • 폭포수 모형 (Waterfall Model) =>  시작, 마무리 -> 시작, 마무리 -> 시작, 마무리 ... 
  • 애자일(기민한) 소프트웨어 개발 (Agile Software Development)

        - 소프트웨어 개발 방법론 중 하나로써 변화되는 고객의 요구사항에 신속하고 기민하게 대응하기 위한 소프트웨어 개발 방법

        - 가장 큰 특징은 반복, 점증하는 개발방식 

        - 애자일 실천방식 : 칸반(Khanban), 페어 프로그래밍

            

 


🧚‍♂️ 간단 역사 : 중세 봉건제 -> 산업화(소품종 대량생산-절차지향) -> 정보화(다품종 소량생산-객체지향)

 

- 객체 지향 (Object Oriented) => 시스템의 기본 단위를 객체로 상정하고 객체와 객체의 관계를 중심으로 분석, 설계, 구현, 운영하는 프로그래밍

 

 

- 객체지향의 장점

     1. 생산성

     2. 유지보수성

 

- 객체 (Object) => 시스템의 기본 단위로 속성과 기능으로 구성

     1. 속성(attribute/variable)

          ㄴ 객체의 정보를 저장하는 영역 (ex. 축구선수 객체의 선수명, 등번호, 신체정보, 골수 )

     2. 기능(operation/method)

          ㄴ 객체의 동작을 정의하는 영역 (ex. 슛, 달리기, 패스 등)

 

- 클래스 (class) => 객체를 생성하기 위한 틀, 설계도

                               클래스 - 붕어빵 틀 / 객체 - 붕어빵 -> 하나의 붕어빵틀(class)로 다수의 붕어빵객체(object) 생성 가능                                                         

 

- 클래스와 객체의 관계 => 실세계의 객체로부터 추상화하여 개발자가 정의한 클래스로부터 실제화(instance)된 정보를 객체라고 한다. (틀과 실제)

 

- 실제화(instance) => 추상적이던 객체가 실제 값을 가지게 되어 구체적으로 실현된 것

 

- 실제화 방법 => new

 

 

- Class, Variable(변수), Method(기능) 기본 문법(Basic Syntax)

 

  • class의 예) => Person 객체 생성을 위한 틀
  public class Person{

  }

 

  • Variable의 예) => Person 객체의 속성정보 name과 money를 저장하기 위한 영역
public class Person{
	String name;
	int money;
}
더보기

variable : method나 생성자 차원에서 정의되는 지역변수(local variable)와 객체의 속성정보를 저장하는 인스턴스변수(instance variable) 또는 객체의 멤버변수가 있다. 

  또한 클래스 변수가 있다.(이후 static에서 공부할 예정)  

 

 

  • method의 예) => Person 객체의 동작을 정의한 eat() method
public class Person{
	String name;
	int money;

	public void eat(){
		// 동작 정의
	}
}

 

 

 

- method 기본 문법 

접근제어자 리턴타입 method명(매개변수리스트){
		// 구현부
}

 

- 리턴타입 

  • void : return값이 없을 때 명시하는 자바 예약어(keyword)
  • return : 호출한 사용자 측(client)으로 정보를 반환할 때 사용하는 자바 예약어
  •   리턴 예)
  public int plus(int i, int j){ //호출한 측으로 반환하는 데이터 타입 int를 void 대신 명시한다.
 	 return i+j;
  }

 

 

method : 객체 기능 

 

   예)

//ATM 입금할 때 돈을 넣고 돌아오는 것은 없다.

public void deposit(int money){
                            // ㄴ 매개변수(지역변수) parameter ; 입력값
}

   

//ATM 출금할 때 돈이 돌아와야 한다.

public int withdraw(int money){
                            // ㄴ 매개변수(지역변수) parameter ; 입력값
}

 

   

  - 접근제어자(access modifier) : 접근의 범위를 설정 => class, instance variable, class variable, method에 명시

 

  public > protected > default(friendly) > private 

 

  public : 다른 패키지에서도 접근 가능, 어디서나 접근가능

  protected : 동일한 패키지 내에서만 접근 가능하나 상속 관계에 있을 때는 다른 패키지에서도 접근가능

  default(friendly) : 동일한 패키지 내에서만 접근가능 

  private : 다른 클래스에서는 접근 불가, 즉 동일한 클래스 내에서만 접근가능

 

  (이후 과정에서 상세히 공부할 예정)

   


 

🔎 Eclipse 실습 내용

 

1. 변수(variable)

package step1;

public class TestVariable1 {
	public static void main(String[] args) {
		// String : 문자열을 저장하기 위한 데이터 타입
		// variable(변수) : local variable 지역 변수 => method 또는 생성자 내부에서 정의하는 변수
		String name="아이유";
		//int : 정수형 데이터를 저장하기 위한 데이터 타입
		int age=30;
		System.out.println("name:"+name+" age:"+age);
	}
}

name:아이유 age:30

 

 

2. 변수 - 객체 생성

package step2;

public class TestVariable2 {
	public static void main(String[] args) {
		Person p = new Person(); // Person 객체 생성
		p.name="아이유";
		System.out.println(p.name);
		p.money=200;
	    System.out.println(p.money);	
	    Person p2=new Person();
	    p2.name="장기하";
	    p2.money=300;
	    System.out.println(p2.name +" "+ p2.money);
	}
}
package step2;

public class Person {
	String name; // 객체의 멤버변수 또는 인스턴스 변수
	int money;
}

아이유
200
장기하 300

 

 

3. Method

package step3;

public class TestMethod {
	public static void main(String[] args) {
		//객체 생성
		Account a1=new Account();
		//name을 할당
		a1.name="아이유";
		//deposit method를 호출해 실행시킨다.
		a1.deposit(100);
		Account a2=new Account();
		a2.name="장기하";
		a2.deposit(4000);
		System.out.println("*****");
		//호출하여 실행한 출금 method가 반환한 money를 변수에 할당받는다. 
		int m=a1.withdraw(10);
		System.out.println("client 출금:"+m);
	}
}
package step3;

public class Account {
	String name; //인스턴스 변수 : 객체의 속성 정보를 저장하는 영역
	/*
	 * method : 객체의 기능을 정의
	 * public : 접근 제어자, 어디서나 접근 가능
	 * void : 리턴값이 없을 때 명시하는 자바 키워드
	 * (int money) : 매개변수(parameter)이자 지역변수
	 * 				 매개변수는 사용하는 측에서 전달한 데이터를 저장하기 위한 공간
	 */
	public void deposit(int money){
		System.out.println("server "+name+"님이 계좌에 "+money+"원을 입금하다.");
	}
	//return 값이 있을 때는 void 대신 리턴값의 타입을 명시한다.
	public int withdraw(int money) {
		//은행 계좌에 잔약을 확인하는 과정
		return money; // 호출한 축으로 money 정보를 return
	}
}

server 아이유님이 계좌에 100원을 입금하다.
server 장기하님이 계좌에 4000원을 입금하다.
*****
client 출금:10

(* server - 클라이언트가 볼 수 없는 영역)

 

 

4. Method(2) - 계산기**

package step4;

public class TestMethod2 {
	public static void main(String[] args) {
	Calculator c=new Calculator();
	int result=c.plus(2,4);
	System.out.println("client 더하기 결과 "+result);
	int result2=c.multiply(2,4);
	System.out.println("client 곱하기 결과 "+result2);
	}
}
package step4;

public class Calculator {
	public int plus(int i, int j) {
		//더하기 연산해서 사용하는 측으로 결과를 리턴한다.
		return i+j;
	}
	public int multiply(int i, int j) {
			//곱하기 연산해서 사용하는 측으로 결과를 리턴한다.
		return i*j;
	}
}

client 더하기 결과 6
client 곱하기 결과 8

 

5. 접근 제어자(Excess Modifier) -1

package step5;
//import : 다른 패키지의 자원을 이용할 때 사용
import step6.Car;

public class TestExcessModifier {
	public static void main(String[] args) {
		//다른 패키지 step6의 Car 객체를 생성해 인스턴스 변수에 접근해본다.
		Car c=new Car();
		System.out.println(c.model);
		//System.out.println(c.model2);
		//ㄴ protected이므로 접근불가
		//System.out.println(c.model3);
		//ㄴ default이므로 접근불가
		//System.out.println(c.model4);
		//ㄴ private이므로 접근불가
	}
}
package step6; 
//접근 제어자 테스트
public class Car {
	//public : 다른 패키지에서 접근 가능
	public String model="k5";
	protected String2 model2="k5";
	String model3="k5";
	private String model4="k5";
}

k5

 

6. 접근 제어자(Excess Modifier) -2

package step7;

public class TestExcessModifier2 {
	public static void main(String[] args) {
		Airplane a=new Airplane();
		System.out.println(a.company);
		System.out.println(a.company2);
		System.out.println(a.company3);
		//System.out.println(a.company4);
		//ㄴ private이므로 접근 불가
        System.out.println(a.getCompany4());
	}
}
package step7;
//접근 제어자 테스트 
public class Airplane {
	public String company="kal";
	protected String company2="kal";
	String company3="kal";
	private String company4="kal"; //private은 다른 클래스에 접근할 수 없다.
	
	public String getCompany4() { //이렇게 클래스 내부에서는 사용할 수 있다.(아직 안배운 부분)
		return company4;
	}
}

kal
kal
kal
kal

 

 

 

 

 

// 오늘의 단축키 

cmd + shift + F = 코드 정리

sysout + control + space bar = System.out.println();

main + control + space bar = public static void main(string[] args){}

 

 

// 오늘의 질문

메인 메소드 출력 값은 리턴 값이랑 다른건가요? 그래서 void를 쓰나요? 

    ㄴ 메인 메소드에서는 리턴값이 없어서 void 사용

    ㄴ 클래스에서 나온 값을 메인 메소드로 리턴을 해줘야하기 때문에 클래스에서는 void가 아니라 리턴으로 입력

 

// 오늘의 이슈

1. 터미널

터미널에서 자바 실행할 때 컴파일까지 잘 됐는데 실행만 하면 자꾸 오류가 떠서 검색해보니 패키지가 있는 경우 패키지 폴더 안에서 실행하면 동작이 안되고 그 상위 폴더에서 패키지이름과 함께 실행해야 실햄됨을 알게 되었음 -> java 패키지이름.클래스이름 (왜인지는 아직도 잘 이해가 되진 않음)

 

 2. Method** (이슈..까지는 아니고)

계산기 클래스 만들고 더하기부분 만들고 같은 클래스 안에 곱하기도 혼자 만들어봄 클래스를 아예 따로 만들어야 하는지 아님 같은 클래스 안에 만들어도 되는지 몰랐지만 일단 같은 클래스 안에 만들어보고 에러뜨면 따로 빼야지 하고 같은 클래스 안에 코드 작성함

 

맨 처음 작성했던 건

package step4;

public class TestMethod2 {
	public static void main(String[] args) {
	Calculator c=new Calculator();
	int result=c.plus(2,4);
	System.out.println("client 더하기 결과 "+result);
	int result2=c.multiply(2,4);
	System.out.println("client 곱하기 결과 "+result2);
 }
}
package step4;

public class Calculator {
	public int plus(int i, int j) {
		//더하기 연산해서 사용하는 측으로 결과를 리턴한다.
		return i+j;
	}
	public int multiply(int a, int b) {
			//곱하기 연산해서 사용하는 측으로 결과를 리턴한다.
		return a*b;
	}
}

=> multiply method 입력값을 (이걸 인자라고 부르는건가..?) 아무튼 변수를 plus method와 다르게 변수를 선언했었다. 왜냐하면 main method에서 plus 부분(?)에서 사용한 입력값을 공유할 것 같아서? 저렇게 작성하고 실행시켜보니 6과 8이라는 값이 바르게 나왔다. 그리고 한번 체크해보려고 

package step4;

public class Calculator {
	public int plus(int i, int j) {
		//더하기 연산해서 사용하는 측으로 결과를 리턴한다.
		return i+j;
	}
	public int multiply(int i, int j) {
			//곱하기 연산해서 사용하는 측으로 결과를 리턴한다.
		return i*j;
	}
}

 multiply method의 입력값을 plus method와 같이 선언해주고 실행해봤는데 똑같이 6과 8이라는 값이 나옴. 호... main에서 result, result2 이렇게 변수를 다르게 선언해주면 계산기 클래스에서 입력값으로 선언된 변수가 같아도 다른 값을 가질 수 있다는 것을 알게 되었따아.

(+ 또 궁금해서 result 변수를 똑같이 사용해서 계산기 클래스에 다른 입력값을 넣었더니 오류가 남 / 같은 plus를 쓰더라도 입력값이 다르면 변수를 다르게 선언해야 함)

 

//오늘의 숙제

복습 + Encapsulation 예습