java day6
메소드(method) | 절차지향 프로그래밍 | 클래스(class) | 생성자(constructor) |
메소드(method)
- 어떤 로직이나 기능을 만들어 내는 방법(함수)
- 코드를 재활용할 수 있도록 하여 경제적으로 코드를 작성할 수 있음.
접근 제어자 [static] 반환타입 메소드명(매개변수, 매개변수2, 매개변수3, ..){
메소드가 호출시 실행될 문장;
...
[return 반환값;]
}
예) static이 없는 메소드
Scanner sc = new Scanner(System.in);
sc.next();
예) static이 붙은 메소드
Math.random();
// JVM 실행시 메모리에 (자동적)우선적으로 올라가기 때문에 객체생성을 하지않아도됨
// static이 많으면 처음 실행시 느려짐
이름만 호출하면 실행되는 메소드
public static void method1(){
System.out.println("Hello Java");
}
--------------------------------------------
method1();
매개변수가 있는 메소드
public static void method2(int num){
System.out.println(num);
}
--------------------------------------------
method2(10);
매개변수가 있고 리턴값이 있는 메소드
public static int method3(int num){
return num;
}
--------------------------------------------
int num = method3(10);
예제
사직연산을 구하는 메소드를 각각 만들어 아래와 같이 출력하는 프로그램을 작성해보자. (단, 메소드는 각 연산마다 변도로 작성, return 키워드를 반드시 사용)
실행결과
첫번째 숫자를 입력하세요 10
두번째 숫자를 입력하세요 3
10+3 = 13
10-3=7
10*3=10
10/3=3.3333
import java.util.Scanner;
public class Method4 {
public static int plus(int num1, int num2) {
return (num1 + num2);
}
public static int minus(int num1, int num2) {
return (num1 - num2);
}
public static int multi(int num1, int num2) {
return (num1 * num2);
}
public static double div(int num1, int num2) {
return ((double) num1 / num2);
}
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();
System.out.println(num1 + " + " + num2 + " = " + plus(num1, num2));
System.out.println(num1 + " - " + num2 + " = " + minus(num1, num2));
System.out.println(num1 + " * " + num2 + " = " + multi(num1, num2));
System.out.println(num1 + " / " + num2 + " = " + div(num1, num2));
}
}
절차지향 프로그래밍
- 물리 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시됨
- 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법
- 장점 : 가독성이 좋음
- 단점 : 협업 어려움
객체지향 프로그래밍(OOP(Object Oriented Programming))
- 실제 세계를 모델링하여 소프트웨어를 개발하는 방법
- 데이터와 절차를 하나의 덩어리(집합)로 묶어서 생각
- 명사(변수), 동사(메소드)로 생각
- 장점 : 협업 유리함
- 단점 : 설계가 어려움
User user = new User();
user.id = "apple";
user.name = "김사과";
user.pass = "1234";
user.age = 20;
user.point = 100;
user.info();
System.out.println("---------------------------");
User member = new User();
member.id = "banana";
member.name = "반하나";
member.pass = "4987";
member.age = 26;
member.point = 102;
member.info();
--------------------------------------------------------------
public class User {
// 필드
String id;
String name;
String pass;
int age;
double point;
//메소드
public void info() {
System.out.println("아이디 : " + id);
System.out.println("이름 : " + name);
System.out.println("비밀번호 : " + pass);
System.out.println("나이 : " + age);
System.out.println("포인트 : " + point);
}
}
아이디 : apple
이름 : 김사과
비밀번호 : 1234
나이 : 20
포인트 : 100.0
---------------------------
아이디 : banana
이름 : 반하나
비밀번호 : 4987
나이 : 26
포인트 : 102.0
클래스(class)
- 설계도와 같은 의미
- 객체의 상태를 저장하는 필드(변수), 객체의 행동을 나타내는 메소드(함수)로 구성
- 설계도(파일) -> 메모리(객체)
클래스 만드는 방법
접근제어자 class 클래스명{
자료형 필드1;
자료형 필드2;
...
메소드1(){
...
}
메소드2(){
...
}
...
}
객체를 생성하는 방법
클래스명 객체명 = new 생성자();
객체의 배열
클래스명[] 참조변수 = new 클래스명[요소의 개수];
Member[] members = new Member[3];
members[0] = new Member();
members[1] = new Member();
members[2] = new Member();
✔ 은닉화
- 내부 데이터, 내부 연산을 외부에서 접근하지 못하도록 은닉 혹은 격리시키는 것
- 변수에 접근 제한자는 private로 지정
- setter, getter 메소드를 사용하여 변수의 접근, 제어함
✔ 추상화
- 공통의 속성이나 기능을 묶어 이름을 붙이는 것(클래스)
- 클래스를 정의하는 것
✔ 캡슐화
- 실제로 구현되는 부분을 외부에 드러나지 않도록 갭슐로 감싸 이용방법만 알려주는 것
- 변수와 함수를 하나로 묶는 것
- 객체가 맡은 역할을 수행하기 위한 하나 목적을 하나로 묶는 과정
생성자(constructor)
- new 연산자를 통해 객체를 생성할때 반드시 호출, 제일 먼저 실행되는 메서드
- 클래스 명과 동일한 이름을 가진 메서드
- 필드를 초기화하는 역할
- 반환 타입이 없음
- 직접 생성하지 않으면 JVM이 자동으로 빈 생성자를 만들어 호출
[public] 클래스명(){
생성자가 호출되면 실행할 문장;
...
}
- 생성자 메소드 오버로딩
- 메소드명이 같고, 시그니처(파라미터의 타입과 개수)가 다른 생성자 메소드를 여러개 만드는 것
- this 키워드 : 현재 클래스의 필드를 가리킴
this.gender = gender;
// this() : 현재 클래스의 생성자
✔ 필드의 선언과 초기값
byte : 0
short : 0
int : 0
long : 0
char : \u0000
float : 0.0
double : 0.0
boolean : false
String, 배열, 클래스, 인터페이스 : null
Person apple = new Person();
System.out.println(apple.getName()); // String : null
System.out.println(apple.getAge()); // String : 0
System.out.println(apple.getHeight()); // String : 0.0
System.out.println(apple.isLover()); // String : false
apple.info();
-----------------------------------------------
public class Person {
private String name;
private int age;
private double height;
private double weight;
private boolean isLover;
public Person() {
this.name = "무명";
this.age = 0;
this.height = 0.0;
this.weight = 0.0;
this.isLover = true;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public boolean isLover() {
return isLover;
}
public void setLover(boolean lover) {
isLover = lover;
}
public void info(){
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("키 : " + height);
System.out.println("몸무게 : " + weight);
System.out.println("애인 : " + isLover);
}
}
실행결과
무명
0
0.0
true
이름 : 무명
나이 : 0
키 : 0.0
몸무게 : 0.0
애인 : true