객체가 가진 기능
메소드의 존재 이유는 코드를 보다 간결하고 객체의 멤버는 객체 스스로 제어하도록 하기 위함
가독성에 용이하고 코드가 간결해 진다
객체 = 변수 + 메소드를 가진 녀석을 지칭함
메소드 만드는 방법
리턴타입 이름(파라미터) { 영역
기능
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//학생 성적관리 프로그램
//이름,국어,영어,평균
String name;
int kor;
int eng;
double avg;
name="same";
kor=80;
eng=75;
avg = (double)(kor+eng)/2;
//만약 이런 학생이 다수면
//위 변수 4개를 매번 만드는 작업이 번거로움
//여러개의 데이터를 관리하는 배열객체 이용
String[] arrName = new String[10];
int[] arrKor = new int[10];
int[] arrEng = new int[10];
double[] arrAvg = new double[10];
arrName[0] = "sam";
arrKor[0] = 80;
arrEng[0] = 70;
arrAvg[0] = (double)(arrKor[0]+arrEng[0])/2;
//위처럼 자료형별로 배열객체로 묶어서 사용하는 것도 가독성 떨어짐
//학생 하나의 데이터가 서로 다른 배열객체에 나누어져 있어서
//그래서 서로 연관있는 데이터끼리(이름, 영어,국어,평균) 묶어서
//관리하는 것이 효과적
//연관있는 데이터 끼리의 믂음을 설계하는 class 정의
//별도의 .java문서에 새로운 클래스를 설계 해보기
//새로 설계한 Student 클래스로 객체를 생성
Student std =new Student();
std.name = "sam";
std.kor = 80;
std.eng=70;
std.avg = (double)(std.kor+std.eng)/2;
Student std2 =new Student();
std2.name = "robin";
std2.kor = 88;
std2.eng=67;
std2.avg = (double)(std2.kor+std2.eng)/2;
//화면 출력
System.out.println( std ); //참조변수를 출력하면 자동 .toString() 발동 [클래스면@해시코드]
System.out.println("name : "+ std.name);
System.out.println("kor : "+ std.kor);
System.out.println("eng : "+ std.eng);
System.out.println("avg : "+ std.avg);
System.out.println();
System.out.println("name2 : "+ std2.name);
System.out.println("kor2 : "+ std2.kor);
System.out.println("eng2 : "+ std2.eng);
System.out.println("avg2 : "+ std2.avg);
System.out.println();
//객체 멤버갮 변경
int k = 94;
std2.kor = k;
std2.avg = (double)(std2.kor+std2.eng)/2;
System.out.println("변경된 국어 성적 : "+ std2.kor);
System.out.println("변경된 평균값 : "+ std2.avg);
//이런식으로 출력 귀찮음
//그래서 객체라는 녀석이 스스로 멤버값을 출력하는 기능이 있다면
//편하게 그 기능 사용
//stu3.출력(); //이러한 기능
//객체가 기능을 가질 수 있도록 클래스 안에 기능(함수) 설계
//메소드 호출
//std3.output();
System.out.println();
//이런식으로 객체 안에 기능을 만들면 편하게 코딩가능
Student std4 =new Student();
std4.name = "kim";
std4.kor = 97;
std4.eng = 91;
//평균 계산하는 것도 매번 작성 귀찮 평균계산 기능 만들기
std4.calAverage();
std4.output();
//이런식으로 특정한 기능들을 미리 class에 설계해 놓으면
//훨씬 코드가 간결해 지기 시작한다
Student std5 = new Student();
std5.name = "lim";
std5.kor = 77;
std5.eng = 68;
std5.calAverage();
std5.output();
Student std6 = new Student();
std6.input("choi", 97, 100);
std6.calAverage();
std6.output();
}
}
public class Student {
//서로 연관있는 데이터들을 저장할 변수를 정의
//Field(필드 : 멤버변수 - 속성)
String name;
int kor;
int eng;
double avg;
//기능 설계
//method
//리턴타입 이름(파라미터){영역 }
void output() {
System.out.println("name : "+ name);
System.out.println("kor : "+ kor);
System.out.println("eng : "+ eng);
System.out.println("avg : "+ avg);
System.out.println();
}
void calAverage() {
avg = (double)(kor+eng)/2;
}
//멤버변수 안에 값을 입력하는 메소드
//메소드 파라미터(매게변수)로 값 전달 받음
void input(String name, int kor, int eng) {
//멤버변수와 매개변수는 서로 다른 변수
//매게변수로 받은 데이터들을 멤버변수로 전달 해 줘야함
//멤버변수 지칭하는 참조변수 this.
this.name = name;
this.kor = kor;
this.eng = eng;
}
}
같은 기능의 메소드가 같은 이름 다른 파라미터를 가지고 있는 것
리턴 값이 다른 건 상관없음을 기억하자
GUI 환경에서는 모든 데이터가 문자열 타입
//사칙연산 기능들 : 메소드
int sum(int x, int y) {
return x+y;
}
int subtract(int x, int y) {
return x-y;
}
int multiple(int x, int y) {
return x*y;
}
int divide(int x, int y) {
return x/y;
}
double sum(double x, double y) {
return x+y;
}
double subtract(double x, double y) {
return x-y;
}
double multiple(double x, double y) {
return x*y;
}
double divide(double x, double y) {
return x/y;
}
//숫자모양의 문자열 데이터의 산술결과 리턴
int sum(String x, String y) {
//분자열을 정수로 변환해주는 기능 이용
int a = Integer.parseInt(x);
int b = Integer.parseInt(y);
return a+b;
}
클래스 안에서 필요한 메소드를 미리 선언해 두면 관리하기에도 용이하고 보다 간결한 코드를 짤 수 있는 것 같다
클래스 별로 잘 묶어두는 것이 클린코드의 시작이라 느꼈다