1) 자바 언어의 실행하기 위한 최소 단위
2) oop(object oriented programming)
3) 객체(object)
4) 프로그래밍 개발 process
주문
- 분석
- 설계
- 구현
- test
- 배포
분석
: 객체, 속성, 동작 설계
: 클래스, 변수, 메서드5) 클래스 문법: public class 클래스명 { }
public class 클래스명 {
// 변수(인스턴스 변수, 필드, 멤버 변수) => 자료형(data) 지정
// 생성자 => 기능 처리
// 메서드 (인스턴스 메서드, 멤버 메서드) => 기능 처리
}
==> main 메서드가 없음 , 핸들링 class 하나 더 생성해서 실행 필
Cat c = new Cat(“야옹이", 2, "암컷");
생성자 호출 코드
public Cat( ) { }
오버로딩 생성자
https://www.nextree.co.kr/p6753/
package p01;
public class Cat {
String name;
int age;
String sex;
// 오버로딩 생성자를 통해 객체 생성 가능
// 모든 정보를 모르는 경우 아래의 생성자를 활용
// 반드시 기본 생성자는 명시적으로 지정하는 습관을 들이자.
public Cat() {
// 기본 생성자
}
// 이름과 나이 정보만 알고있는 경우 아래의 생성자를 활용
public Cat(String name, int age) {
this.name = name; // 인자로 들어온 로컬변수명과 인스턴스명이 동일 => this 사용 필
this.age = age;
}
// 정보를 다 알고있는 경우 아래의 생성자를 활용
public Cat(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
}
this ( );
=> public Cat () { }
this ("야옹이", 2);
=> public Cat (String n, int a){ };
package p02;
public class Cat {
String name;
int age;
String sex;
public Cat() {
this("야옹", 2); // 생성자 public Cat(String name, int age) 호출
System.out.println("Cat 기본 생성자");
}
public Cat(String name, int age) {
/* 객체지향적(중복x, 재사용가능)으로 this 사용할 수 있다~
* 세 번째 생성자의 중복되는 내용 없앨 수 있다.
* this.name = name;
this.age = age;
* */
this(name, age, "암컷" ); // this 키워드로 생성자 호출 시 반드시 첫 라인에 기재 필
System.out.println("Cat (String name, int age) 생성자");
}
public Cat(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
}
package p02;
public class TestCat {
public static void main(String[] args) {
// 3번째 생성자 이용
// public Cat(String name, int age, String sex)
// new 키워드를 통한 생성자 호출 및 값 초기화
Cat c1 = new Cat ("야옹1",2,"암컷");
Cat c2 = new Cat ("야옹2",1,"암컷");
Cat c3 = new Cat ("야옹3",5,"암컷");
Cat c4 = new Cat ("야옹4",4,"암컷");
Cat c5 = new Cat ("야옹5",2,"암컷");
// 2번째 생성자 이용 - 성별을 지정하지 않았지만, 암컷까지도 저장하자.
// 고정된 값("암컷")은 매번 지정하지 말고, 클래스.java에서 this 키워드써서 인자로 넘기자
// this(name, age, "암컷" );
// public Cat(String name, int age)
Cat x1 = new Cat ("야옹1",2);
Cat x2 = new Cat ("야옹2",1);
Cat x3 = new Cat ("야옹3",5);
Cat x4 = new Cat ("야옹4",4);
Cat x5 = new Cat ("야옹5",2);
}
}
public 리턴타입 메서드명 ([변수..]) {
문장;
[return 값;]
}
4) 특징:
-반드시 호출해야 한다.
-호출되어 실행이 끝나면 호출한 곳으로 돌아간다
가) 객체 생성
A a = new A();
나) 메서드 접근 (호출)
예)
public class MethodEx02 {
public static int div() {
int a = 10, b = 5;
int result = a / b;
int result2 = a * b;
return result; // 호출한 곳으로 값 반환
// return result2; // 컴파일 에러
}
public static void main(String[] args) {
System.out.println(div()); // 메소드 호출 후 리턴값 출력
}
}
5) 기능에 따른 메서드 종류 (4)
공통 사항
리턴 x, 매개변수 x
public 리턴타입 메서드명() {
문장;
}
리턴 x, 매개변수 o
public 리턴타입 메서드명(변수) {
문장;
}
리턴 o, 매개변수 x
public 리턴타입 메서드명() {
문장;
return 값;
}
리턴 o, 매개변수 o
public 리턴타입 메서드명(변수) {
문장;
return 값;
}
package p03;
public class Test {
// 1. 파라미터 없고 리턴 없는 형태
public void a() {
System.out.println("a 메서드");
}
// 2. 파라미터 있고 리턴 없는 형태
public void b (int n) {
System.out.println("b 메서드" + n);
}
public void b2 (int n, String n2) {
System.out.println("b2 메서드" + n + "\t" + n2);
}
// 3. 파라미터 없고 리턴 있는 형태
public int c()
{
System.out.println("c 메서드");
return 100;
}
public String c2()
{
System.out.println("c2 메서드");
return "AAAA";
}
// 4. 파라미터 있고 리턴 있는 형태
public int d(int n, int n2)
{
System.out.println("d 메서드");
return n+n2;
}
public int d2(int n, int n2)
{
System.out.println("d 메서드");
return n+n2;
}
}
package p03;
public class TestMain {
public static void main(String[] args) {
// a 메서드 호출
Test t = new Test();
t.a();
// 리턴 값이 없는 메서드 출력 불가 System.out.println(t.a());
// b 메서드 호출
t.b(10);
t.b2(10, "AAA");
// c 메서드 호출
// 리턴 값을 저장하는 변수가 필요하다
int n = t.c();
System.out.println(n);
System.out.println(t.c());
String n2 = t.c2();
System.out.println(n2);
System.out.println(t.c2());
// d 메서드 호출
int m = t.d(10, 20);
System.out.println(m);
System.out.println(t.d(10, 20));
}
}
package p04;
public class Test {
// 1. 파라미터 없고 리턴 없는 형태
String name;
public void a() {
System.out.println("a 메서드");
this.name = "aa";
b(); // // 같은 클래스 내에서 함수 호출 시 객체 생성 안해도 됨
this.b();
}
// 2. 파라미터 있고 리턴 없는 형태
public void b () {
System.out.println("b 메서드" );
}
public void b2 (int n, String n2) {
System.out.println("b2 메서드" + n + "\t" + n2);
}
// 3. 파라미터 없고 리턴 있는 형태
public int c()
{
System.out.println("c 메서드");
return 100;
}
public String c2()
{
System.out.println("c2 메서드");
return "AAAA";
}
// 4. 파라미터 있고 리턴 있는 형태
public int d(int n, int n2)
{
System.out.println("d 메서드");
return n+n2;
}
public int d2(int n, int n2)
{
System.out.println("d 메서드");
return n+n2;
}
}
package p04;
public class TestMain {
public static void main(String[] args) {
Test t = new Test(); // 다른 클래스 내에서 함수 호출 시 new를 통한 객체 생성 필
t.a();
}
}
public class MethodEx03 {
public static void sum(int a) { // int a 매개변수
int sum = 0;
for (int i = 0; i <= a; i++) { // a = 15
sum += i;
}
System.out.println(sum);
}
public static void sum(int a, int b) { // int a, b 매개변수 / 메소드 오버로딩
int sum = 0;
for (int i = a; i <= b; i++) { // a = 5, b = 20
sum += i;
}
System.out.println(sum);
}
public static void main(String[] args) {
sum(15); // sum(int a); 호출 및 값 전달
sum(5, 20); // sum(int a, b); 호출 및 값 전달
}
}
메서드이름(데이터타입… 변수이름) { }
- 데이터타입 뒤에 점을 세 개 찍음으로써 가변 길이 인자 선언한다.
- 점 세 개는 앞에 선언한 타입으로 배열을 생성하여 가변 길이 인자를 처리하겠다는 의미이다.
public void a (int ... n) {
// int ... n => 배열로 저장
}
a(10);
a(10,20);
a(10,20,30...);
package p05;
import java.util.Arrays;
// main이 없는 class는 public 기재하면 안됨
class Test{
// 가변인자 ==> 내부적으로 배열로 관리됨
// int 타입으로 배열을 생성하여 가변 길이 인자를 처리
public void a(int...n) {
System.out.println(Arrays.toString(n));
}
public void b (int n, String...n2) {
System.out.print(n);
System.out.println(Arrays.toString(n2));
}
}
// public 지정자는 main 함수를 지닌 클래스만 사용 가능
public class TestMain {
public static void main(String[] args) {
Test t = new Test(); // 객체(인스턴스) 생성
t.a(10);
t.a(10,20);
t.a(10,20,30);
t.b(1, "A");
t.b(1, "A", "B");
t.b(1, "A", "B", "C");
}
}
메소드명 동일
매개변수의 자료형, 개수, 순서를 다르게 하여 선언
생성자 오버로딩과 메소드 오버로딩 비교
public void a() { }
// public int a() { } 호출시 구분 불가 => 에러
// 즉 리턴타입은 오버로딩과 무관함 (인자리스트로만 구분)
public void a(int n) { }
public void a(String n) { }
public void a(int n, String n2) { }
public void a(String n, int n2) { }
package p06;
class Test2{
// 오버로딩 메서드
public void a() {};
// 리턴 타입은 오버로딩과 무관함 (인자 리스트로만 구분)
// public int a() {}; => 추후 t.a();로 호출 시 식별 불가
public void a(int n) {};
public void a(String n) {};
public void a(int n, String n2) {};
public void a(String n2, int n) {};
}
public class TestMain {
public static void main(String[] args) {
// 대표적인 오버로딩 메서드 println(), print()
System.out.println(10);
System.out.println("aaa");
}
}
1) 개념: 하나의 클래스 안에 동일 이름(클래스명)의 생성자가 여러 번 정의할 수 있다.
각각의 생성자를 식별하기 위해, 인자리스트의 개수,자료형, 순서가 달라야 한다.
Cat 클래스의 재사용성이 증가
public Cat() { }
public Cat(int n) { }
public Cat(String n) { }
public Cat(int n, String n2) { }
public Cat(String n, int n2) { }
ref. https://bcp0109.tistory.com/360
https://velog.io/@ahnick/Java-Call-by-Value-Call-by-Reference
메서드 호출 시 전달하는 파라미터 (인자 값)
call by value