본문 바로가기
코딩/수업 정리

20.12.04 Fri [010]

by 6^6 2020. 12. 4.
728x90

액세스마더타입?이뭐여...?

 

  • public과 defualt 접근제어자 사용법
  • 캡슐화 (!= 정보은닉)
  • 클래스변수와 클래스메소드
  • 계산기 - 선생님 풀이
  • 숫자맞추기게임
  • 오늘의문제

 

정보은닉은 왜 필요할까?

 함부로 접근할수없게 막기 위해서 접근제한 두는것.

 

 

 

 

public과 (default) 접근제어자 사용법

package zoo;

public class Cat {
	public void makeSound() {
		System.out.println("야옹");
	}
	
	void makeHappy() { //(default)
		System.out.println("스마일");
	}
}

 

package animal;

public class Dog {
	public void welcome(zoo.Cat c) { 
    
		c.makeSound();//출력o - public 접근제어자로 설정
    			//public이 붙은 변수, 메소드는 어떤 클래스에서라도 접근이 가능하다.
		
		c.makeHappy(); //오류 - 접근제어자가 default로 설정
        		//default는 해당 패키지 내에서만 접근이 가능하기 때문에
	}

}

 

 

멤버변수는 기본적으로 아니 반드시!!! private 붙여야한다. //클래스 내부에서만 접근가능

 

 

public static void main(Stringp[] args){ // 왜 public 이 붙을까 -  jvm이 올리면서 class로더가 올리게 되어있다. 

jvm이 가장먼저 찾아야하는 함수 = main함수

따라서 public을 쓸수밖에 없다.

 

 

캡슐화(!=정보은닉)

최소한의 로직으로 내가 원하는 목적의 프로그램을 만들수 있게끔 구성하는것

(=프로그래밍을 잘짜는 방법,가장쓰기편하게 만드는것.)

 

 

클래스변수와 클래스메소드

static이란? 

 class InstCnt {
	 static int instNum = 0; //여기에 static을 붙이고 안붙이고의 차이
	 //변수앞에 static을 붙이면 = 클래스 변수=static변수=공유 변수
	 //static이 없으면 인스턴스 변수이다. 
	 InstCnt(){
		 instNum++; //static안붙이면 그냥 1만붙이고 끝.
		 System.out.println("인스턴스 생성 : " +instNum);
	 }
}
 class ClassVar{
	 public static void main(String[] args) {
		 InstCnt cnt1 = new InstCnt();
		 InstCnt cnt2 = new InstCnt();
		 InstCnt cnt3 = new InstCnt();
	 }
 }

 

.class를 new새롭게 만들어서(객체) 어떻게 올리느냐?

card가 참조형함수로 나오게되면 메소드 area

 

새롭게 만들어진 객체card를 만나면 .class에 card에있는 static을 올린다.

static변수는 한번만올리고 두번다시 올리지않는다.

 

계산기

package CalMain;

import java.util.Scanner;

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

		while (true) { //근데 while문처럼 몇번돌리는 로직은 메인에 넣어야한다.

			Scanner sc = new Scanner(System.in);

			int num1 = sc.nextInt();
			char op = sc.next().charAt(0);
			int num2 = sc.nextInt();
			int result = 0;

			switch (op) {
			case '+': {
				result = num1 + num2;
				break;
			}
			case '-': {
				result = num1 - num2;
				break;
			}
			case '*': {
				result = num1 * num2;
				break;
			}
			case '/': {
				result = num1 / num2;
				break;
			}

			}
			System.out.println(num1 + " " + op + " " + num2 + " = "+result);
			System.out.println("계속하시겠습니까? Y | N");
			char c= sc.next().charAt(0);
			if(c=='y'||c=='Y')
				continue;
			else
				break;			
		}

		System.out.println("종료");
	}
}

↑하나의 클래스로만

↓나눠서

public class Calculator {

	private int num1;
	private char op;
	private int num2;

	public int getNum1() {
		return num1;
	}

	public void setNum1(int num1) {
		this.num1 = num1;
	}

	public char getOp() {
		return op;
	}

	public void setOp(char op) {
		this.op = op;
	}

	public int getNum2() {
		return num2;
	}

	public void setNum2(int num2) {
		this.num2 = num2;
	}

	Calculator(int num1, int num2, char op) {
		this.num1 = num1;
		this.num2 = num2;
		this.op = op;
	}

	public Calculator() {
		// TODO Auto-generated constructor stub
	}

	public void run() {
		int result = 0;
		switch (op) {
		case '+': {
			result = num1 + num2;
			break;
		}
		case '-': {
			result = num1 - num2;
			break;
		}
		case '*': {
			result = num1 * num2;
			break;
		}
		case '/': {
			result = num1 / num2;
			break;
		}
		}

		System.out.println(num1 + " " + op + " " + num2 + " = " + result);

	}

}
import java.util.Scanner;

public class CalMain {

	public static void main(String[] args) {

		while (true) {
			Scanner sc = new Scanner(System.in);

			int num1 = sc.nextInt();
			char op = sc.next().charAt(0);
			int num2 = sc.nextInt();

			/*
			 * 객체를 생성시켜놓고 반복문이 돌때마다 생성된 객체에 값만 바꿈 calculator.setNum1(num1);
			 * calculator.setOp(op); calculator.setNum2(num2);
			 */

			// 객체를 생성시키고 반복문이 돌때마다 다른 위치에 객체를 계속 생성시킴
			Calculator calculator = new Calculator(num1, num2, op); //★★무조건 순서에 맞춰서 안에 꼭숫자써야함 안써주니까 0만 출력됨
			calculator.run();

			System.out.println("계속하시겠습니까?(y/n)");

			char c = sc.next().charAt(0);

			if (c == 'Y' || c == 'y')
				continue;
			else
				break;

		}

		System.out.println("프로그램이 종료 되었습니다.");
	}

}

 

 

 

//숫자맞추기게임  - 내코드

public class Number {

	private static int comnum = (int) (Math.random() * 100) + 1;

	public static void main(String[] agrs) {

		while (true) {
			Scanner sc = new Scanner(System.in);
			int num = sc.nextInt();
			
			
			// 컴퓨터는 랜덤으로 숫자지정

			if (comnum == num) {
				System.out.println("정답입니다.");
				break;
			} else if (comnum < num) {
				System.out.println("down");
				continue;
			} else if (comnum > num) {
				System.out.println("up");
				continue;
			}
		}
	}
}

 

 

www.notion.so/201204_-_010_-static-74aa2cd5f06342f59bbf0e8478d06ec8

오늘의문제

1.아래의 접근제한자에 대하여 설명하시오.
-private - 한 클래스 내에서 접근가능
-protected - 상속관계에 있는 클래스에서 접근가능
-default - 패키지 내에서 접근가능
-public - 어디서나 접근 가능


2.지역변수에 접근제한자를 붙이지 않는 이유는?

지역변수는 한 메소드 또는 반복문, 특정 모듈 안에서 사용되고 사라지기 때문에 접근 제한자를 굳이 만들 필요가 없다.


3.캡슐화에 대하여 설명하시오. - 비유:감기약

최종 사용자이 가장 쉽게 프로그램을 쓸 수 있도록 하기 위해.

최소한의 로직으로 내가 원하는 목적의 프로그램을 만들수 있게끔 구성하는 것. 실제로 구현된 부분은 외부에 노출시키지 않는다.

 

/*여기서 캡슐화라는 개념이 나온다. 캡슐화는 하나의 클래스는 그 내부에서 어떤 작업을 하는지에 관점을 두는 것이 아니라, 어떤 역할을 하는지에 초점을 두는 개념이다. 즉, 실제로 구현된 부분은 외부에 노출시키지 않고 특정 기능만을 알려주는 것이다.

 

따라서 캡슐화를 실현하기 위해서 내부에 선언된 데이터를 공개할 것인지, 아니면 숨겨서 안보이게 할 것인지 정확하게 정의해줄 필요가 있다. 이것이 정보은닉(Data Hiding)이라고 하는 개념이다. 정보은닉은 캡슐화를 실현하기 위한 구체적인 방법의 일종이라고 할 수 있다.

 

예를들어 내가 랜덤으로 숫자를 생성하여 사용자가 그 숫자를 맞추게 하는 간단한 게임 프로그램을 만들었다고 하면, 랜덤으로 생성된 이 숫자는 private으로 선언하여 클래스 외부로 보여주지 않고, 단지 클래스 내부의 다른 함수들을 통해 비교하고 정답 여부를 도출하는 것에만 사용해야 한다는 것이다.*/


4.랜덤 숫자 맞추기 게임을 짜시오.

5.static 변수의 다른 용어 3가지를 말해 보시오.

static 변수=클래스 변수=공유 변수


6.자바의 메모리 영역을 3가지로 나누고, 해당 영역에 들어가는 정보를 말하여 보시오. - 전공자들은 이것만 6개월 연습함.

메소드 영역 (Method Area) : static 변수의 정보

 

스택 영역(Stack Area) = call stack. : 메인함수 안에 생성되는 객체(메모리 주소를 가리킴)와 호출되는 함수들. 순차적으로 생성 되었다가 사용이 끝나면 사용이 끝나는 순서로(생성된 순서와 반대 순서) 삭제됨

 

 영역 (Heap Area) : 객체의 인스턴스 변수와 메소드 정보, static 변수를 포함하고 있는 클래스의 주소 정보 (동일한 클래스의 객체이고, static 변수가 있다면 static 변수 정보는 공유:같은 주소 공유)

 

 

 

 

 

 

 

 


7.static 변수의 접근 방법은?

클래스 내부에서 직접접근→ 클래스이름 변수이름 = new 클래스이름()
인스턴스 생성후 접근→클래스이름.인스턴스이름
클래스의 이름으로 접근→클래스이름.

 


8.클래스 변수의 활용의 예를 드시오.

인스턴스 별로 가지고 있을 필요가 없는 변수 → static 변수 선언이 좋다.

  • 값의 참조가 목적인 변수
  • 값의 공유가 목적인 변수

그리고 그 값이 외부에서도 참조하는 값이라면 public으로 선언한다.

 

ex) Math.PI

public static final double PI = 3.14159265358979323846;

1)값의 공유가 목적이며 2)이 값은 변하지 않기 때문에 인스턴스 생성 시마다 각각 인스턴스 별로 이 값을 가지기 위한 메모리 공간을 잡을 필요가 없다. 효율적으로 메모리 공간을 활용하기 위해서는 이런 변수들은 static 선언을 해 줄 필요가 있다.

 

 

9.스태틱 함수에 인스턴스 변수가 올수 없는 이유는?
인스턴스 함수는 static, 인스턴스 변수 모두 사용할 수 있는데, static변수가 메모리에 먼저 올라와 있기 때문에(메모리 생성 시기가 빠름) 호출할 수 있는 것이다.


10.아래의 프로그램을 작성 하시오.

다음 멤버를 가지고 직사각형을 표현하는 Rectangle 클래스를 작성하라.

- int 타입의 x, y, width, height 필드: 사각형을 구성하는 점과 크기 정보
- x, y, width, height 값을 매개변수로 받아 필드를 초기화하는 생성자
- int square() : 사각형 넓이 리턴
- void show() : 사각형의 좌표와 넓이를 화면에 출력
- boolean contatins(Rectangle r) : 매개변수로 받은 r이 현 사각형 안에 있으면 true 리턴
- main() 메소드의 코드와 실행 결과는 다음과 같다

public static void main(String[] args) {
   Rectangle r = new Rectangle(2, 2, 8, 7);
   Rectangle s = new Rectangle(5, 5, 6, 6);
   Rectangle t = new Rectangle(1, 1, 10, 10);
   
   r.show();
   System.out.println("s의 면적은 "+s.square());
   if(t.contains(r)) System.out.println("t는 r을 포함합니다.");
   if(t.contains(s)) System.out.println("t는 s를 포함합니다.");
}
(2,2)에서 크기가 8x7인 사각형
s의 면적은 36
t는 r을 포함합니다

//수정해야함↓

public class RecMain {
	public static void main(String[] args) {
		Rectangle r = new Rectangle(2, 2, 8, 7);
		Rectangle s = new Rectangle(5, 5, 6, 6);
		Rectangle t = new Rectangle(1, 1, 10, 10);
		
		r.show();
		
		System.out.println("s의 면적은 " + s.square());
		if (t.contains(r))
			System.out.println("t는 r을 포함합니다.");
		if (t.contains(s))
			System.out.println("t는 s를 포함합니다.");
	}
//		(2,2)에서 크기가 8x7인 사각형
//		s의 면적은 36
//		t는 r을 포함합니다.
 
}

 

public class Rectangle {
	// x, y, width, height 값을 매개변수로 받아 필드를 초기화하는 생성자

	private int x, y, width, heigh;
	//Rectangle rectangle;
	// 선언하자마자 초기화가능 Rectangle rectangle = new Rectangle(); 데이터타입이 Rectangle이고
	// 4byte메모리 올림.

//	public Rectangle(Rectangle r) { // Rectangle받아서 주소 만든것.
//		rectangle = r;
//	}

	public Rectangle(int x, int y, int width, int heigh) {
		this.x = x;
		this.y = y;
		this.width = width;
		this.heigh = heigh;
	}
	
	

// 사각형의 좌표와 넓이를 화면에 출력 =(2,2)에서 크기가 8x7인 사각형
	public void show() {
		System.out.println("(" + this.x + "," + this.y + ")에서 크기가 " + 
	(this.width) + "x" + (this.heigh) + "인 사각형");
	}

//매개변수로 받은 r이 현 사각형(t) 안에 있으면 true 리턴 
	public boolean contains(Rectangle r) {
    
		if ((this.y+this.heigh >= r.y+r.heigh) && 
				(this.x+this.width >= r.y+r.width) && 
				(this.width * this.heigh) >= (r.width * r.heigh))
			return true;
		else
			return false;
	}

// 사각형 넓이 리턴
	public int square() {
		return width * heigh;
	}
}

 

728x90

'코딩 > 수업 정리' 카테고리의 다른 글

20.12.08 Tue [012]  (0) 2020.12.08
20.12.07 Mon [011]  (0) 2020.12.07
20.12.03 Thu [009]  (0) 2020.12.03
20.12.02 Wed [008]  (0) 2020.12.02
참고하기 좋은 사이트  (0) 2020.12.01

댓글