JAVA/JAVA BASIC

[JAVA] 클래스, 함수

아잠만_ 2024. 3. 18. 12:49

클래스

  • 필드
  • 생성자
  • 메소드

속성(field) + 동작(method)로 구성

public class ClassExample {	
	// field
	String field1;
	int field2;
	
	// 메인 메소드
	public static void main(String[] args) {
		
	}
	
	//메소드
	public void method1() {
		
	}
	
	// 생성자
	public ClassExample() {
		
	}
	public ClassExample(String field1) {
		this.field1 = field1;
	}	
}

필드

객체의 고유 데이터, 가져야할 부품, 현재상태 데이터 등을 저장

public class Student {
	String name;
	int kor;
	int eng;
	int math;
	int sum;
	double avg;
	int rank;
}

heap에 입력하기 위해선 new를 통해 만들어져야함

ClassName 이름 = new ClassName();

 

public class StudentExample {
	public static void main(String[] args) {
		Student s1 = new Student();
		s1.name = "홍길동";
		s1.kor=90;
		s1.eng=80;
		s1.math=85;
		s1.sum=s1.kor+s1.eng+s1.math;
		s1.avg=s1.sum/3.0;
		
		Student s2 = new Student();
		s2.name = "김철수";
		s2.kor=87;
		s2.eng=80;
		s2.math=90;
		s2.sum=s2.kor+s2.eng+s2.math;
		s2.avg=s2.sum/3.0;
	}
}

public class Tv {
	String company;
	int year;
	int size;
	@Override
	//부모 클래스에있는 내용을 재가공
	public String toString() {
		return "Tv [company=" + company + ", year=" + year + ", size=" + size + "]";
	}
	
	// alt + shift + s
	// toString
}
public class TvExample {
	public static void main(String[] args) {
		Tv tv1 = new Tv();
		tv1.company="LG";
		tv1.year=2024;
		tv1.size=50;
		
		Tv tv2 = new Tv();
		tv2.company="삼성";
		tv2.year=2023;
		tv2.size=85;
		
		System.out.println(tv1.company+" "+tv1.year+" "+tv1.size);
		
		System.out.println(tv2);
	}
}
LG 2024 50
Tv [company=삼성, year=2023, size=85]

생성자

생성자의 이름은 해당 클래스의 이름과 같아야함
public class Constructor {

	public static void main(String[] args) {
		Constructor c = new Constructor("오리");
		//생성자가 하나라도 있다면 기본 생성자가 자동으로 만들어지지 않는다
		//그러므로 기본 생성자를 각주 시키면 오류발생
		System.out.println(c.name);
		
		Constructor c2 = new Constructor();
		c2.name = "거위";
	}

	// 기본 생성자
	public Constructor() {
		System.out.println("기본 생성자");
	}
	// 필드로 내용을 저장 보통 이름을 같게 쓴다
	String name;
	
	public Constructor(String name) {
		System.out.println("파라미터가 있는 생성자");
		this.name = name;
		// this 클래스 내부에 있는 name을 의미 >> this.name==String name
		// 우측 name은 클래스변수로 설정된 Constructor(String name)
		// ctrl을 누르고 좌클릭을 통해 연관되어있는지 확인 가능
	}
}
파라미터가 있는 생성자
오리
기본 생성자

생성자는 오버로딩이 지원이 된다

오버로딩 : 클래스 내에 같은 이름의 생성자나 메소드를 선언하는 것


public class Korean {
	// 국적 이름 나이를 각 필드로 만들고
	String nation="한국";
	String name;
	int age;
	
	// 생성자를 통해 데이터 입력 해보기
	public Korean(String name, int age){
		this.name=name;
		this.age=age;
	}

	@Override
	public String toString() {
		return "Korean [nation=" + nation + ", name=" + name + ", age=" + age + "]";
	}
}
public class KoreanExample {
	public static void main(String[] args) {
		Korean k1 = new Korean("오리",20);
		System.out.println(k1);
	}
}
Korean [nation=한국, name=오리, age=20]

public class Student {
	
	public static void main(String[] args) {
		Student s1 = new Student("일본","405","이름1",20);
		Student s2 = new Student("406","이름2",20);
		Student s3 = new Student("이름3",20);
		Student s4 = new Student("이름4",20);
		System.out.println(s1);
		System.out.println(s2);
		System.out.println(s3);
		System.out.println(s4);
	}
	
	// 국적, 반호수, 이름, 나이
	String nation="한국";
	String roomNo="405";
	String name;
	int age;
	
	public Student(String nation, String roomNo, String name, int age) {
		this.nation=nation;
		this.roomNo=roomNo;
		this.name=name;
		this.age=age;				
	}


	public Student(String roomNo, String name, int age) {
		this.nation="한국";
		this.roomNo=roomNo;
		this.name=name;
		this.age=age;	
//		this("한국", roomNo ,name ,age);
	}
	
	public Student(String name, int age) {
		this.name=name;
		this.age=age;
//		this("405",name,age);
	}
	
	@Override
	public String toString() {
		return "Student [nation=" + nation + ", roomNo=" + roomNo + ", name=" + name + ", age=" + age + "]";
	}
	
}

package kr.or.ddit.study06.sec03;

public class Triangle {

	public static void main(String[] args) {
		Triangle t1 = new Triangle(0, 0, 0, 10, 10, 0);
		System.out.println(t1);
		
		Triangle t2 = new Triangle(new Point(0,0), new Point(0,10),new Point(10,0));
		System.out.println(t2);
		
		Point[] points = new Point[3];
		points[0]=new Point(0,0);
		points[1]=new Point(0,10);
		points[2]=new Point(10,0);
		Triangle t3 = new Triangle(points);
		System.out.println(t3);
	}
	
	// 삼각형 3점 죄표, 넓이
	int x1;
	int y1;

	int x2;
	int y2;

	int x3;
	int y3;

	double area;

	public Triangle(int x1, int y1, int x2, int y2, int x3, int y3) {
		this.x1 = x1;
		this.y1 = y1;

		this.x2 = x2;
		this.y2 = y2;

		this.x3 = x3;
		this.y3 = y3;

		this.area = Math.abs((x1 * y2 + x2 * y3 + x3 * y1) - (x1 * y3 + x2 * y1 + x3 * y2)) / 2;
	}

	public Triangle(Point p1, Point p2, Point p3) {
		this(p1.x,p1.y,p2.x,p2.y,p3.x,p3.y);
		//위의 생성자가 호출되어 계산이 자동으로 되어짐
	}
	// 위의 생성자를 참조하기를 위해
    // this연산자에 위의 변수만큼의 값을 대입
	public Triangle(Point[] points) {
		this(points[0],points[1],points[2]);
	}

	@Override
	public String toString() {
		return "Triangle [x1=" + x1 + ", y1=" + y1 + ", x2=" + x2 + ", y2=" + y2 + ", x3=" + x3 + ", y3=" + y3
				+ ", area=" + area + "]";
	}

}

메소드

매개변수 선언

메소드 실행할 때 필요한 데이터를 받기 위한 변수 선언

public class MethodExample1 {

	public static void main(String[] args) {
		MethodExample1 me = new MethodExample1();
		me.method1();
		me.method2(10);
		me.method3("문자열");
		me.method4("문자열",20);
	}
	
	public void method1() {
		System.out.println("파라미터 없는 메소드");
	}

	public void method2(int num) {
		System.out.println("int num을 파라미터로 가지는 메소드");
		System.out.println("외부에서 받은 값 : "+num);
	}
	
	public void method3(String str) {
		System.out.println("String str을 파라미터로 가지는 메소드");
		System.out.println("외부에서 받은 값 : "+str);		
	}

	public void method4(String str, int num) {
		System.out.println("String str, int num을 파라미터로 가지는 메소드");
		System.out.println("외부에서 받은 값 : "+str+", "+num);		
	}
}
파라미터 없는 메소드
int num을 파라미터로 가지는 메소드
외부에서 받은 값 : 10
String str을 파라미터로 가지는 메소드
외부에서 받은 값 : 문자열

public int arrName (int ... array)
public class MethodExample4 {
	public static void main(String[] args) {
		MethodExample4 me = new MethodExample4();
		me.addArray2(1,2,3);
		me.addArray2(1,2,3,4);
	}
	// 값이 정해져있지 않을 때 ... 사용
	// int[] array 대신 int .. array
	public int addArray2(int ... array) {
		int sum = 0; 
		for(int num : array) {
			sum+=num;
		}
		System.out.println(sum);
		return sum;		
	}
	
	
}

리턴타입

메소드가 리턴하는 타입

리턴을 하면 그 즉시 메소드를 종료하기 때문에

리턴 밑의 코드는 쓸 수 없다.

import java.util.Arrays;

public class MethodExample2 {
	public static void main(String[] args) {
		MethodExample2 me = new MethodExample2();
		int i1 = me.method1();
		System.out.println("method1에서 받은 결과값 : "+i1);
		double d2 = me.method2();
		System.out.println("method2에서 받은 결과값 : "+d2);
		int[] arr3 = me.method3();
		System.out.println("method3에서 받은 결과값 : "+Arrays.toString(arr3));
	}
	public int method1() {
		System.out.println("public int method1()");
		return 20;
	}

	public double method2() {
		System.out.println("public int method2()");
		return 10.5;
	}
	
	public int[] method3() {
		System.out.println("public int method3()");
		int[] arr= {1,2,3};
		return arr;
	}
}
public int method1()
method1에서 받은 결과값 : 20
public int method2()
method2에서 받은 결과값 : 10.5
public int method3()
method3에서 받은 결과값 : [1, 2, 3]

package kr.or.ddit.study06.sec04;

public class Cal {
	public static void main(String[] args) {
		Cal cal = new Cal();
		int add1 = cal.add(1, 4);
		System.out.println(add1);
		double add2 = cal.add(2.1, 3.4);
		System.out.println(add2);
		int sub = cal.sub(1, 4);
		System.out.println(sub);
		double div = cal.div(7, 3);
		System.out.println(div);
		int mul = cal.mul(4, 4);
		System.out.println(mul);
	}
	
	// a b 값을 매개변수로 결과값을 a+b로 하는 메소드 만들기
	public int add(int a, int b) {
		return a+b;
	}
	// 오버로딩
	public double add(double a, double b) {
		return a+b;
	}
	// a b 값을 매개변수로 결과값을 a-b로 하는 메소드 만들기
	public int sub(int a, int b) {
		return a-b;
	}
	// a b 값을 매개변수로 결과값을 a/b로 하는 메소드 만들기
	public double div(int a, int b) {
		return a/b;
	}
	// a b 값을 매개변수로 결과값을 a*b로 하는 메소드 만들기
	public int mul(int a, int b) {
		return a*b;
	}
}

리턴을 하면 멈추는 성질로 break문 대신에 사용이 가능하다

public void method1() {
	while(true) {
		System.out.println("1. 회원가입");
		System.out.println("2. 종료");
		int sel=2;
		if(sel==2) return;
	}	
}

public double div(int a, int b) {
	if(b==0) {
	return 0;
	}
	return (double)a/b;
}

void로 설정한 경우가 아닌 경우엔 리턴값은 언제나 반드시 존재해야된다

if로 return값을 달리 설정할 때 다른 나머지 return값도 넣어야한다.

메소드 사용

Class이름 name = new Class이름();
int a = name.메소드이름();

메소드는 클래스 안에 포함되어있으므로 이름과 함께 호출해야된다.

클래스 내부에 있는 메소드는 외부에있다면 다른 클래스의 같은 이름을 지닌 어떤 변수값을 가져올지 혼동이 올 수 있기 때문에 변수와 함께 클래스 내에 저장된다. 외부에 저장되는 메소드도 존재함


public class Circle {
	double Pi = Math.PI;
	public static void main(String[] args) {
		Circle c = new Circle();
		double area = c.area(3);
		double round = c.round(3);
		System.out.println("원의 넓이 : "+area+", 원의 둘레 : "+round);
	}
	
	// 파라미터 r 입력 받아 넓이를 리턴하는 메소드 완성
	public double area(int r) {
		return r*r*Pi;
	}
	
	// 파라미터 r 입력 받아 둘레를 리턴하는 메소드 완성
	public double round(int r) {
		return 2*r*Pi;
	}
}

public class MethodExample3 {
	int a = 10;
	int b = 5;
	
	public static void main(String[] args) {
		MethodExample3 m1 = new MethodExample3();
		m1.callA();
		m1.callB();
		m1.b = 7;
		m1.sum();
		
		MethodExample3 m2 = new MethodExample3();	
		m2.a = 8;
		m2.b = 5;
		m1.sum();
		m2.callA();
		m2.sum();
	}

	public int callA() {
		System.out.println(a);
		return a;
	}
	public int callB() {
		System.out.println(b);
		return b;
	}
	public void sum() {
		System.out.println(callA()+callB());
	}
    	//System.out.println(a);
    	//System.out.println(b);
    	//System.out.println(a+b);
}

다른 클래스에서 변환된 값은 변하지 않는다.

메소드 내부에서도 메소드 끼리 호출이 가능함. (내부에 있으므로 접근이 가능)

함수

 contains()

변수명.contains("찾을 단어")           // 값이 포함하는지 확인
public void method1() {
	String test = "문자열 test 입니다.";
	
	String search = "test";
	
	if(test.contains(search)) {
		System.out.println(search+"값이 포함되어 있습니다.");
	}
}

 startsWith(), endsWith()

변수명.startsWith("찾을 단어")           // 앞문장이 같은지 확인
변수명.endsWith("찾을 단어")           // 뒷 문장이 같은지 확인
public void method2() {
	String test = "문자열 test 입니다.";
	
	String start = "문자열";
	
	if(test.startsWith(start)) {
		System.out.println(start+"로 시작합니다.");
	}
	
	String end = "입니다.";
	
	if(test.endsWith(end)) {
		System.out.println(end+"로 끝납니다.");
	}
}

 toUpperCase(), toLowerCase()

변수명.toUpperCase()           // 대문자로 변환
변수명.toLowerCase()           // 소문자로 변환
public void method3() {
	String test = "소문자 abcd";
	
	test = test.toUpperCase();
	System.out.println(test);
}

 trim()

변수명.trim()           // 좌, 우 공백과 개행문자를 삭제
public void method4() {
	String test = "			문자열 테스트				";
	test = test.trim();
	
	System.out.println(test);
}

 replace() replaceAll()

변수명.replace("바꿀 문자열", "변환될 문자열")           // 문자열 원하는 문자열로 변환
public void method5() {
	String s = "abcdbabo";
	s.replace("babo","***");
	System.out.println(s);
}

replaceAll은 정규식으로 해당하는 여러문자를 한번에 바꿀 수 있음

변수명.replaceAll("[바꿀문자열 정규식]","변환될 문자열")           // 여러 문자를 변환
	public void method5() {
		String s = "abcdbabo2024";
		s=s.replaceAll("\\d","");
//		s=s.replaceAll("/[0-9]/","");
		System.out.println(s);
	}

★ split()

문자열.split("구분 문자열")           // 쪼개어 배열로 변환
public void method6() {
	String test = "test1, test2, test3, test4";
	String[] tokens = test.split(",");
	for(String token : tokens) {
		token = token.trim();
		System.out.println(token);
	}
}

equals()

변수명.equals("문자열")
변수명.equalsIgnoreCase("문자열")           // 대소문자 무시
public void method7() {
	while(true) {
		System.out.println("계속하시겠습니까(y/n)");			
		String yn = sc.next();
			
		if(yn.contentEquals("n")) {
			break;		// N 입력 시 false
		}								
        
   		if(yn.equalsIgnoreCase("n")) {
			break;		// N 입력 시 true
		}
	}		
}

 

자주 사용하는 메소드

Arrays.toString()

Arrays.toString(변수명)            //  배열내용 출력 메소드 
int[] arr = {1,2,3,4,5,6};
System.out.println(Array.toString(arr));
[1, 2, 3, 4, 5, 6]

Arrays.sort()

Arrays.fill()

Arrays.copyOfRange()

Arrays.copyOfRange(배열 , 복사할 인덱스 시작값, 복사할 인덱스 마지막값)