KDT/Java

231221 Java

001cloudid 2023. 12. 21. 17:40
728x90

복습

 

객체지향프로그래밍

객체 : 눈에 보이는 사물 모두

객체 지향 프로그래밍(Object Oriented Programming) : 객체를 기반으로하는 프로그래밍하는 것, 객체를 정의하고 객체 간 협력으로 프로그래밍하는 것.

cf) 절차지향프로그래밍 : 일어나는 일을 시간순으로 프로그래밍하는 것

 

클래스

객체지향프로그램은 클래스를 기반으로 프로그래밍한다.

클래스는 객체의 속성과 기능을 코드로 구현한 것이다.

객체를 클래스로 구현하는 것을 '클래스를 정의한다.'라고 한다.

클래스를 정의하려면 클래스의 이름과 클래스가 가지는 속성(특성)이 필요하다.

ex) 사람 객체를 클래스로 살펴보면

객체를 표현할 클래스의 이름 : Person

객체가 가지는 속성 : 이름, 나이, 직업, 사는 곳 등

클래스 속성(특성)은 클래스 내부에 변수로 선언한다.

이렇게 선언하는 클래스의 속성을 '멤버 변수'

클래스를 정의하는 문법은

(접근제어자) class 클래스이름{
 멤버변수;
 메소드;
}

※ 접근제어자가 public인 경우 자바 파일이름과 클래스 이름이 같아야한다.

ex) Person.java이라는 자바 파일이 있다면
public class Person{
 String name;
 int age;
 String job;
 String address;
}

 

클래스를 만들 때는 class 예약어를 사용한다.

클래스 이름을 Person 라고 정했다.

{ } 안에 클래스 내용을 구현한다.

모든 요소가 클래스 내부({ }안에) 있어야하며, { } 외부에는 package선언과 import 문장 외에 아무것도 선언하지 않는다.

 

※클래스 이름 짓는 규칙 

coding convension에 따라 클래스 이름은 대문자로 시작

 

Person 클래스에서 사람 객체가 가지는 속성(이름, 나이, 직업, 직업)을 변수로 선언하였다.

클래스 내부에 선언하여 객체 속성을 나타내는 변수가 멤버변수(member variable)이다.

멤버 변수
 String name; 
 int age;
String job;
String address;

클래스에 선언하는 멤버 변수는 다른 말로 속성(property), 특성(attribute)등으로 표현한다.

멤버 변수는 속성이 무엇이냐에 따라 알맞은 자료형을 선언해줘야한다.

 

멤버 변수를 선언할 때 int, double형과 같이 기본 자료형(primitive data type)으로 선언 할 수도 있고,

또 다른 클래스형으로 선언할 수도 있다.

클래스형이란 다른 말로 객체 자료형 또는 참조 자료형이라고 한다.

참조 자료형으로 사용하는 클래스는 String, Date와 같이 이미 JDK에서 제공하는 것일 수도 있고, 개발자가 직접 만든

Person, Student 같은 클래스가 다른 클래스에서 사용하는 멤버 변수의 자료형이 될 수도 있다.

변수의 자료형 - 기본자료형(int, long, float, double 등)
                       |
                       - 참조 자료형(String, Date, Person 등)

 

클래스를 선언하고 클래스 속성인 멤버 변수를 선언하였는데, 클래스에서는 사람 객체가 가지는 속성을 사용해 사람과 관련된 기능을 구현할 수 있다. 예를 들어 '사람에게 이름을 부여한다.', '사람에게 직업을 부여한다.'

클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현한 것을 '멤버 함수(member function)' 또는 메소드(method)'라고 한다.


public class Person{
 String name;
 int age;
 String job;
 String address;

 public void show(){
 System.out.println(name + " , " + job);
 }
}

 public void show(){
 System.out.println(name + " , " + job);
 }

Person 클래스 안에 show() 메소드를 추가하였다. 이 메소드는 사람 이름과 직업을 출력하는 기능

 

메소드

메소드는 함수의 한 종류이다.

함수란 하나의 기능을 수행하는 일련의 코드이다. 어떤 기능을 수행하도록 미리 구현해 놓고 필요할 때마다 호출하여 사용할 수 있다.

 

함수는 이름이 있고 입력 값과 결과 값을 갖는다. 예를 들어 두 수를 더하는 함수라고 한다면 두 수를 입력받아서 더하기 함수를 거치면 두 수의 합으로 변환한다.

 

함수가 하는 일을 코드로 구현하는 것을 '함수를 정의한다'라고 한다.

int add(int num1, int num2){
 int result;
 result = num1 + num2;
 return result;
}

add : 함수 이름, int num1, int num2 : 매개변수, return : 예약어, int : 함수 반환형      

 

return : 예약어

add()함수를 수행한 후 결과 값은 변수 result에 저장된다. result에 저장된 결과 값은 함수를 호출했을 때 반환되는 값이므로 '반환 값'이라고 부른다. '이 함수의 결과 값을 반환한다'를 뜻하는 예약어가 return이다.

반환 값의 자료형을 반환형이라고 하는데 함수이름 앞에 써준다.

 

반환 값이 없는 함수도 있는데, 반환값이 없다고 반환형을 쓰는 위치를 비워두면 오류가 발생한다. 이 때 void 예약어를 써준다. void는 '반환할 값이 없다'라는 뜻의 예약어이다.

void printHi(String name){
 System.out.println(name + " Hi");
 return;
}

전달받은 매개 변수 name을 사용하여 출력

 

return 예약어는 함수 수행을 끝내고 프로그램 흐름 중에서 호출한 곳으로 다시 되돌아갈 때도 사용할 수 있다.

void divide(int num1, int num2){
 if(num2==0){
 System.out.println("num2는 0이 될 수 없습니다.");
} else {
 int result = num1/ num2;
 System.out.println(num1 + "/" + num2 + " = " + result);
 }
}

num2가 0이라면 오류가 발생한다. 함수 수행을 종료하는 목적으로 return 뒤에 반환값을 적지 않아도 된다.

 

함수 호출하고 값 반환하기

함수를 사용하는 것을 '함수를 호출한다'라고 한다.

정수를 더한 후 결과 값을 돌려주는 함수를 정의하고 호출하기

생략

public class test{
 public static void main(String[] args){
  int num1 = 10;
  int num2 = 5;
  int sum = add(num1, num2);
}

public static int add(int a, int b){
  int result = a + b;
  System.out.println(a + "+" + b + " = " result);
  return result;
}
}

※ num1, num2는 main() 함수의 변수이다. add(num1, num2)로 사용하면 add() 함수에 두 값을 넘겨줄 수 있다.

매개변수 a,b는 실제 함수로 넘어온 두 값을 받아 주는 역할이다. 즉, a, b는 add() 함수에서 선언한 새로운 변수이다.

따라서 함수를 호출할 때 사용하는 변수 이름과 호출되는 함수에서 사용하는 변수는 서로 다른 변수이므로 이름이 같아도 되고 달라도 된다.

 

함수 호출과 스택 메모리

함수를 호출하면 그 함수만을 위한 메모리 공간이 할당되는데, 이 메모리 공간을 스택(stack)이라고 부른다.

함수가 호출되면 그 함수가 사용할 메모리 공간이 스택에 생성된다.

위의 예를 기준으로 프로그램을 시작할 때 main()함수로부터 호출하기 때문에 가장 먼저 main()함수에 포함된 변수 num1, num2, sum를 저장할 메모리 공간이 스택에 새롭게 생성된다.

add() 함수 수행이 끝나고 함수에 할당했던 메모리 공간을 해제하는 과정은 결과값이 반환되면 add() 함수가 사용하던 메모리 공간은 자동으로 사라진다. 프로그램에서 여러 함수를 사용하는 경우에 함수를 호출한 순서대로 메모리 공간이 만들어지고 맨 마지막에 호출한 함수부터 반환된다.

메모리 공간도 맨 마지막에 추가된 것부터 스택에서 사라진다.

A(), B(), C() 함수가 있고 A() → B() → C() 함수의 순서로 호출했다면 C() → B() → A() 순서로 반환되고 스택 메모리도 이 순서대로 소멸된다.

함수 내부에서만 사용하는 변수를 지역 변수라고 하는데, 지역 변수는 스텍 메모리에 생성된다.

 

package test7_2;

 

public class Member {

 

private String id;

private String password;

private String name;

 

//기본 생성자

public Member() { }

 

//일반 생성자

public Member(String id, String password, String name) {

this.id = id;

this.password = password;

this.name = name;

}

 

//멤버 변수내의 데이터값을 출력하는 메서드

public void show() {

System.out.println("id = " + this.id + " , password = " + this.password + " , name = " + this.name);

}

 

//getter, setter

public String getId() {

return id;

}

 

public void setId(String id) {

this.id = id;

}

 

public String getPassword() {

return password;

}

 

public void setPassword(String password) {

this.password = password;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

 

 

}

 

package test7_2;

 

import java.util.ArrayList;

 

//DAO는 Data Access Object의 약자로, DB의 데이터에 접근하기 위한 객체를 가리킨다.

//DB에 접근하기 위한 로직을 분리하기 위해 사용한다.

//직접 DB에 접근 하여 data를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.

 

public class MemberDAO {

 

//객체 1개만 매개변수로 전달됨 m1(객체)

public void insertMember(Member member) {

System.out.println("MemberDAO : insertMember(Member member) 메서드 호출!!");

System.out.println("아이디 : " + member.getId());

System.out.println("비밀번호 : "+ member.getPassword());

System.out.println("이름 : "+ member.getName());

}

 

//객체 배열이 매개변수로 전달됨 member(배열)

public void insertMember1(Member[] m) {

for(int i = 0 ; i < m.length ; i++) {

System.out.println("MemberDAO : insertMember1(Member[] m) 메서드 호출!!");

System.out.println(m[i]);

System.out.println("아이디 : " + m[i].getId());

System.out.println("비밀번호 : " + m[i].getPassword());

System.out.println("이름 : " + m[i].getName());

System.out.println("--------------------");

}

}

 

//ArrayList 클래스를 이용한 배열이 매개변수로 전달됨 mem(Arraylist 객체)

public void insertMember2(ArrayList<Member> mem) {

System.out.println("MemberDAO : insertMember2(ArrayList<Member> mem) 메서드 호출!!");

 

for(int i = 0; i< mem.size(); i++) {

Member m = mem.get(i);

System.out.println(m.getId());

System.out.println(m.getPassword());

System.out.println(m.getName());

System.out.println("---------------");

}

}

 

 

 

 

 

 

}

 

package test7_2;

 

import java.util.ArrayList;

 

public class MemberTest {

 

public static void main(String[] args) {

 

//id, password, name의 데이터값을 담은 객체 3개를 생성하여 저장해 둘 객체 배열 생성

 

//3명의 Member 객체 생성 : 일반생성자 호출

Member m1 = new Member("j1", "123", "정은주");

Member m2 = new Member("s2", "456", "손예률");

Member m3 = new Member("c3", "789", "천세훈");

 

//3명의 Member 객체 생성 : 객체 배열 생성

Member[] member = new Member[] {m1,m2,m3};

 

for(int i = 0 ; i < member.length ; i++) {

System.out.println("-- 객체 배열로 출력 --");

System.out.println(member[i].getId());

System.out.println(member[i].getPassword());

System.out.println(member[i].getName());

System.out.println("---------------");

}

System.out.println("---------------");

 

 

// ArrayList 배열에 Member 3명 저장

ArrayList<Member> mem = new ArrayList<Member>();

mem.add(m1);

mem.add(m2);

mem.add(m3);

System.out.println("---------------");

 

// for 출력

for(int i = 0; i < mem.size(); i++) {

System.out.println("-- ArrayList 출력 --");

Member m = mem.get(i); //변수에 객체 주소를 받아 넣기

//System.out.println(mem.get(i)); //객체 주소를 출력

 

System.out.println(m.getId());

System.out.println(m.getPassword());

System.out.println(m.getName());

System.out.println("------------------");

}

 

System.out.println("--- 향상된 for문 사용 ---");

for (Member m : mem) {

System.out.println(m.getId());

System.out.println(m.getPassword());

System.out.println(m.getName());

//m.show();

}

 

System.out.println("=====================");

 

//MemberDAO 객체 생성

MemberDAO memberDAO1 = new MemberDAO();

 

//객체 1개만 매개변수로 전달됨 : m1 객체를 매개변수로 넘기기

//public void insertMember(Member member)메서드 호출

 

memberDAO1.insertMember(m1);

System.out.println("------------------");

 

 

//객체 배열이 매개변수로 전달됨 : member 객체 배열을 매개변수로 넘기기

//public void insertMember1(Member[] m) 메서드 호출

memberDAO1.insertMember1(member);

System.out.println("------------------");

 

 

//ArrayList 클래스를 이용한 배열이 매개변수로 전달됨 : mem 제네릭 배열을 매개변수로 넘기기

//public void insertMember2(ArrayList<Member> mem) 메서드 호출

memberDAO1.insertMember2(mem);

 

 

 

 

 

 

 

 

 

 

 

 

}

 

}

 

 

 

728x90

'KDT > Java' 카테고리의 다른 글

231228 Java  (0) 2023.12.28
231227 Java  (0) 2023.12.27
231220 Java  (0) 2023.12.20
231218 Java  (0) 2023.12.18
231214 Java  (0) 2023.12.14