D+09::오버로딩/setter/getter/접근제한자/게시판/계산기

Am.Vinch·2022년 7월 8일
0

220707Thu ClassStudy 2
클래스,객체,인스턴스
클래스 : 자료형과 같다. > 참조자료형,우리가 앞으로 만들 객체를 위한 설계도이다.
클래스(설계도)만 가지고 무언가를 할 수 없다.
클래스의 구성요소 (맴버변수) : 맴버변수, 매소드의 정의,생성자 >> 클래스는 이 세가지로 이루어져있다.
맴버변수 = 필드,속성 동일어
객체: 클래스(설계도)로부터 만들어진 실체 => "인스턴스"로 같은 말이다.
클래스로 객체를 만들면 클래스의 임무는 끝난 것임.
객체생성문법: [ 클래스명 + 객체명 (참조변수명) = new 생성자(); ] //생성자 호출
객체를 생성할때는 무조건 생성자를 호출할 수 밖에 없다.

프로젝트명 ClassStudy02

public class Circle {

[접근제한자]

	"맴버"변수의 선언(지역변수x,매개변수x), 메소드 선언, 클래스 선언에서 사용 가능
	클래스 선언 시에는 public,default에서만 사용 가능

① public : 같은 프로젝트 내에 있는 파일에서 접근 가능.(메소드,변수 모두 가능)
② private : 같은 프로젝트 내에 있는 파일에서만 접근 가능. 나만 쓸거야.
③ default :같은 패키지 내에서만 접근가능 (같은프로젝트 내에 있어도 다르면 불가능)
④ protected : 상속 배운 후 이해가능

하지만 기본적으로 
모든 메소드는 public 사용
모든 변수는 private 사용하라.
생성자는 public  사용하라.



public class Circle {
private int r; //원의 반지름

//실수를 줄이기위한 방법
//직관적인 방법 사용x - int r ;

//반지름을 세팅하는 메소드
public void setR(int r) {
	//this.r =r ;
	if( r<=0) {
		this.r = 0;
	}
	else {
		this.r =r;
	}
}


//매개변수로 반지름을 전달받아서 
//해당 반지름의 원의 둘레를 출력하는 메소드를 만들자
public void printSize() {
	System.out.println(2*3.14*r);
}

}

[값을 변경하는 방법; 메소드를 사용해야하는 이유]

public class CircleTest {

public static void main(String[] args) {
	
	//바로 대입해서 직관적으로 사용하는 방법
	Circle c1 = new Circle(); // 생성자 호출
	//c1.r= 10; >> Circle클래스에서 private 접근제한자 값으로 설정되어있기때문 사용불가.
	c1.printSize();
	
	
	//매소드를 사용해서 값 변경하는 방법
	Circle c2 = new Circle();
	c2.setR(10);
	c2.printSize();
	

// 이유? 실수를 줄이기위해. 직관적인방법은 실수를 바로잡기 어려움.
}

}


public class Monitor {

	main메소드 x
	클래스 내부 구성요소 3가지  
		//① 맴버변수(필드,속성)
		String modelName;
		double inch;
		int price;
		
		//② 생성자: 맴버의 초기화 작업
		//문법: 리턴값x + 클래스명 일치 +매개변수도 일치  
		//생성자를 만들지 않으면 기본생성자를 자동으로 만들어준다.
        //(매개변수자리에 아무것도없어도---17,18,19줄 해당)
		//생성자는 원하는 만큼 만들 수 있다.생성자명 중복가능>> 생성자 오버로딩
		//대신 매개변수의 정보가 모두 같으면 불가능하다.		
		
		//---생성자 오버로딩(overloading)-----//
		//생성자의 이름이 같아도 매개변수의 정보가 다르면 중복으로 생성 허용
		//매개변수의 정보 : 매개변수의 자료형, 매개변수의 수 
		
		//매개변수를 정수로받는 생성자 -1
		public Monitor(int num) {
			modelName = "";
			inch = 0.0;
			price = 0;		
		}
		
		//매개변수의 자료형이 다른  생성자-2
		public Monitor(String a) {
			
		}
		
		public Monitor() {//매개변수가 없는 생성자-3
			
		}
		
		
		//③ 매소드
		public void setMonitor(String modelName,double inch, int price) {
			//위에있는 이 매소드 밖 변수와 차이를 두기위해서 this. 사용함.
			this.modelName = modelName;
			this.inch = inch;
			this.price = price;
			
		}
		
		//출력하는 매소드(오버로딩)
		public void displayInfo() {//매개변수가 없음.
			System.out.println(modelName);// 자동완성사용하기
			System.out.println(inch);
			System.out.println(price);
		}	
		public void displayInfo(int num) { //매개변수의 자료형이 다름
			System.out.println(modelName);// 자동완성사용하기
			System.out.println(inch);
			System.out.println(price);
		}
		
--------------------------------------------------------------------			
			[그렇다면, 왜 오버로딩을 사용하는가?]
			
//오버로딩 이용하지 않을 때

			//문제) 매개변수로 정수를 하나 받아서 정수를 출력하는 메소드를 만들어라.
			public void printInt( int num) {
				System.out.println(num);
			}
			
			//문제) 매개변수로 문자열 하나 받아서 정수를 출력하는 메소드를 만들어라.
			public void printStr( String str) {
				System.out.println(str);
			}
			//매개변수로 실수를 하나 받아서 실수를 출력하는 메소드
			
			public void printDouble( Double d) {
				System.out.println(d);
			}
			
		```
//오버로딩 이용할 때
		오버러딩으로 매소드명을 중복사용하면 매개변수만 다르면 이용가능하다.
		
		//문제) 매개변수로 정수를 하나 받아서 정수를 출력하는 메소드를 만들어라.
		public void print( int num) {
			System.out.println(num);
		}
		
		//문제) 매개변수로 문자열 하나 받아서 정수를 출력하는 메소드를 만들어라.
		public void print( String str) {
			System.out.println(str);
		}
		//매개변수로 실수를 하나 받아서 실수를 출력하는 메소드
		
		public void print( Double d) {
			System.out.println(d);
		}	
	}
public class MonitorTset {

	public static void main(String[] args) {//실행시키기위해  main 메소드 만들기
		//모니터 객체 m1 생성
		//클래스명 객체명 =  new 생성자명(); // 생성자명은 클래스명과 일치함. 자동완성사용하기.
		Monitor m1 = new Monitor(10);//생성자 호출
		Monitor m2 = new Monitor();//생성자 호출
		
		//모니터의 정보를 출력하라.
		System.out.println(m1.modelName);// [객체명.+ 변수] 입력 >> 접근가능. 
		System.out.println(m1.inch);
		System.out.println(m1.price);
		//위에 생성자 호출을 했기 때문에
		//Monitor 클래스 안 생성자 값 대로 출력이 된다.
		
		//이전 클래스에서 만든 메소드 사용해서 각각 변수값 변경.
		
		
		
		//방법 1 - 직관적인 방법
		//m1.inch = 45;
		//방법 2
		m1.setMonitor("좋은 모니터", 24.0, 100000);
		
		
		
		
		//출력하기
		m1.displayInfo();
		// TODO Auto-generated method stub
		
		//--생성자 오버로딩 테스트--//
		Monitor a = new Monitor();
		Monitor b = new Monitor(10);
		Monitor c = new Monitor("김자바");
		
		 m1.print("ggg");
	}
}

package ClassTest;

public class Board {
private int boardNum; //게시글 글번호
private String title;//게시글 제목
private String writer;//게시글 작성자
private int readCnt;//조회수

public Board(int boardNum, String title, String writer, int readCnt) {
	super();
	this.boardNum = boardNum;
	this.title = title;
	this.writer = writer;
	this.readCnt = readCnt;
}
//setter
public void setBoardNum(int boardNum) {
	this.boardNum = boardNum;
}
public void setTitle(String title) {
	this.title=title; 
}
public void setWriter (String writer) {
	this.writer =writer;
}
public void setReadCnt(int readCnt) {
	this.readCnt= readCnt;
	System.out.println();
}

//getter
public int getBoardNum() {
	return boardNum;
}
public String getTitle() {
	return title;
}
public String getWriter() {
	return writer;
}
public int getReadCnt() {
	return readCnt;
}

public void showInfo() {
	System.out.println("Board [boardNum=" + boardNum + ", title=" + title + ", writer=" + writer + ", readCnt=" + readCnt + "]");
}

}

package ClassTest;

public class BoardTest {

public static void main(String[] args) {
	//게시글(board) 을 10개 저장할 수 있는 배열을 생성.
	Board[] boards = new Board[10]; 
	//새로운 게시글 객체를 생성해서 boards라는 객체의 0번째에 넣는다.
	boards[0] = new Board(1, "제목1", "작성자1", 0);
	boards[1] = new Board(2, "제목2", "작성자2", 1);
	boards[2] = new Board(3, "제목3", "작성자1", 2);
	boards[3] = new Board(4, "제목4", "작성자2", 0);
	boards[4] = new Board(5, "제목5", "작성자1", 10);
	boards[5] = new Board(6, "제목6", "작성자2", 0);
	boards[6] = new Board(7, "제목7", "작성자1", 5);
	boards[7] = new Board(8, "제목8", "작성자2", 1);
	boards[8] = new Board(9, "제목9", "작성자1", 0);
	boards[9] = new Board(10, "제목10", "작성자2", 0);

	//	

// //모든 게시글의 정보(글번호,제목,작성자,조회수)를 출력하라.
// //[방법 1]
// for(int i = 0 ; i< boards.length; i++) {
// boards[i].showInfo();// boards라는 객체의 값을 출력하기위해. 객
// }
//
//
// //[방법 2]
// //for each문 바꾸기
// for(Board e : boards) {
// //boards에서 데이터를 하나씩 뺀다.자료형은 게시글이기때문에 "Board"
// //e : 게시글 하나를 의미한다.
// e.showInfo();
// e.getTitle().equals("888");//빼내온 게시글 하나의 타이틀이 888인지 문자열을 비교하라.
// }

	//작성자의 이름이 '작성자1'인 게시글의 모든 정보를 출력하라.
	//for 문

// for(int i = 0; i<boards.length; i++) {
// if(boards[i].getWriter().equals("작성자1")){//문자열로받았기때문에 .equals 사용하기.
// boards[i].showInfo();
// }

//for-each문
// for(Board e : boards) {
// if(e.getWriter().equals("작성자1")){
// e.showInfo();
// }
//

	//제목이 '제목5'인 게시글의 작성자를 출력

// for(int i = 0; i<boards.length; i++) {
// if(boards[i].getTitle().equals("제목5")) {
// System.out.println(boards[i].getWriter());
// }

	//모든 게시글의 조회수의 합을 출력하라
	int sum = 0;// for문 밖으로 반드시 빼기 
	for(int i = 0; i<boards.length; i++) {
			sum = sum + boards[i].getReadCnt();
	}
	System.out.println(sum);//반드시 for문 밖으로 빼야한다. 그렇지않으면 각각의 값이 반복해서 출력됨.
}
		

}

package ClassTest;

public class Calculator {
private int num1;
private int num2;
private String oper;

//
public void setNumber(int num1, int num2) {
	this.num1 = num1;
	this.num2 = num2;
}


//12번
//더한 결과를 리턴하는 메소드 
public int add() {
	return num1 + num2;
}

public int sub() {
	return num1 -num2;
}
public int multi() {
	return num1*num2;
}
public double divide() { //정수 나누기는 실수
	return (double)num1/num2;
}

}

package ClassTest;

import java.util.Scanner;

public class CalculatorTest {

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	
	System.out.print("첫 번째 수: ");
	int num1 = sc.nextInt();
	
	System.out.print("두 번째 수: ");
	int num2 = sc.nextInt();
	
	sc.nextLine();//주의!! 문자와 숫자 연달아 입력받을 때, 엔터값을 넣어주어야 값이 나올 수 있음..
	
	System.out.print("연산자 : ");
	String oper = sc.nextLine();
	
	// return 메소드를 사용하기위해 객체를 선언해줘야한다.
	Calculator c = new Calculator();
	//
	c.setNumber(num1, num2);
	
	
	//스위치 반복문 사용
	switch(oper) { 
	case"+":  
		// 10 + 20 = 30
		System.out.println(num1 + oper +num2 + "= " + c.add() );// 객체를 사용하려면 "객체명.메소드명()" 방식 입력
		break;
	case"-": 
		System.out.println(num1 + oper + num2 + "= " + c.sub());
		break;
	case"*": 
		System.out.println(num1+ oper + num2 + "= " + c.multi());
		break;
	case"/":
		System.out.println(num1 + oper + num2+ "= " + c.divide());
		break;
		// 위 네 개가 모두 아닐 때
	default:
		System.out.println("정신 차려!");
	}
}

}

profile
Dev.Vinch

0개의 댓글