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