System.out.println(클래스이름.static변수);
일반 멤버변수로 생성 시 다른 클래스끼리 할당되는 메모리공간부터 다르기때문에 공유할 수가 없게 됨
=> static 변수를 이용하여 해결
회사에 사원이 입사할 때 사번을 순차적으로 부여하는 예제(1001, 1002, 1003 ...)
-Employee.java-
public class Employee {
public static int serialNum = 1000;
private int employeeId;
private String employeeName;
private String department;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
-EmployeeTest.java-
public class EmployeeTest {
public static void main(String[] args) {
Employee employeeLee = new Employee();
employeeLee.setEmployeeName("이순신");
System.out.println(employeeLee.serialNum);
Employee employeeKim = new Employee();
employeeKim.setEmployeeName("김좌진");
employeeKim.serialNum++;
System.out.println(employeeKim.serialNum);
}
}
serialNum
변수가 static변수가 아니었을 경우 각 변수들마다 각각의 Heap메모리에 공간을 할당받으므로 공유가 불가능했음.
위와 같은 예제를 생성자를 이용하여 생성자가 호출될 때마다 serialNum을 증가시킴
이때 멤버변수인 serialNum을 그대로 사번으로 사용하면 모든 사원이 같은 사번을 공유하게 되므로 생성된 사번을 인스턴스변수에 저장하여 사원마다 모두 다른 사번을 사용할 수 있게 한다.
-Employee.java-
예제1에서 생성자를 추가.
public Employee() {
serialNum++;
employeeId = serialNum;
}
-EmployeeTest.java-
public class EmployeeTest {
public static void main(String[] args) {
Employee employeeLee = new Employee();
employeeLee.setEmployeeName("이순신");
Employee employeeKim = new Employee();
employeeKim.setEmployeeName("김좌진");
System.out.println(employeeLee.getEmployeeName() + "," + employeeLee.getEmployeeId());
System.out.println(employeeKim.getEmployeeName() + "," + employeeKim.getEmployeeId());
}
}
public class EmployeeTest {
public static void main(String[] args) {
// Employee employeeLee = new Employee();
// employeeLee.setEmployeeName("이순신");
//
// Employee employeeKim = new Employee();
// employeeKim.setEmployeeName("김좌진");
System.out.println(Employee.serialNum);
// System.out.println(employeeLee.getEmployeeName() + "," + employeeLee.getEmployeeId());
// System.out.println(employeeKim.getEmployeeName() + "," + employeeKim.getEmployeeId());
}
}
static클래스는 클래스가 로딩될 때 이미 메모리에 올라가있기 때문에 위처럼 객체를 만들지 않아도 사용할 수 있다.
단, 접근 시 객체명이 아닌 클래스명을 이용하는것을 권장함.
참고
static변수
=클래스 변수
=정적 변수
모두 같은 말이니 용어의 사용에 주의하자.
출처-패캠java,spring과정 박은종강사님 자료
각 인스턴스와 그에 따른 멤버변수마다 모두 다른 값을 가지면 안되는 경우가 있음.
예-시간(모든 객체마다 시간개념이 다를 경우 문제발생), 회사(사원은 다수이지만 회사는 유일)
-Company.java-
public class Company {
private static Company instance = new Company(); // 유일한 객체 선언
private Company() { }
public static Company getInstance() {
// static메서드로 선언했기 때문에 외부에서 호출 시 인스턴스를 생성하지 않아도 호출가능
if(instance == null) instance = new Company();
return instance;
}
}
-CompanyTest.java-
public class CompanyTest {
public static void main(String[] args) {
Company company1 = Company.getInstance();
Company company2 = Company.getInstance();
System.out.println(company1);
System.out.println(company2);
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
}
}
JVM이 할당해 준 Heap메모리의 주소가 출력됨.
주소가 같은 하나의 인스턴스임을 확인가능.
자동차 공장이 있습니다. 자동차 공장은 유일한 객체이고, 이 공장에서 생산되는 자동차는 제작될 때마다 고유의 번호가 부여됩니다.
자동차 번호가 10001부터 시작되어 자동차가 생산될 때마다 10002, 10003 이렇게 번호가 붙도록 자동차 공장 클래스, 자동차 클래스를 구현하세요
다음 CarFactoryTest.java 테스트 코드가 수행 되도록 합니다.
-CarFactoryTest.java-
public class CarFactoryTest {
public static void main(String[] args) {
CarFactory factory = CarFactory.getInstance();
Car mySonata = factory.createCar();
Car yourSonata = factory.createCar();
System.out.println(mySonata.getCarNum()); //10001 출력
System.out.println(yourSonata.getCarNum()); //10002 출력
}
}
못풀겠다...아무래도 더 간단한 예제 풀어보고 다시 풀어야할듯.
객체를 생성하고 기능구현을 위한 관계설계를 못하겠음.
int[] arr1 = new int[10];
int arr2[] = new int[10];
for (자료형 변수명 : 배열명) {
//내용
}
선언한 변수에 배열의 값들이 0번 index의 값부터 마지막 index의 값까지 차례로 대입되는 for문.
public class ArrayTest {
public static void main(String[] args) {
int[] arr = new int[10];
int total = 0;
for (int i = 0, num = 1; i < arr.length; i++) {
arr[i] = num++;
}
for (int num : arr) {
total += num;
}
System.out.println("total = " + total);
}
}
public class CharArrayTest {
public static void main(String[] args) {
char[] alphabets = new char[26];
char ch = 'A';
for (int i = 0; i < alphabets.length; i++) {
alphabets[i] = ch++;
}
for (char alpha : alphabets) {
System.out.println(alpha + ", " + (int)alpha);
}
}
}
-Book.java-
public class Book {
private String title;
private String author;
public Book() { }
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public void showInfo() {
System.out.println(title + ", " + author);
}
}
-BookTest.java-
public class BookTest {
public static void main(String[] args) {
Book[] library = new Book[5];
for(int i=0; i<library.length; i++) {
System.out.println(library[i]);
}
}
}
모두 null이 출력됨을 확인할 수 있음.
객체가 할당되는게 아니라는 의미.
위의 예제에서 BookTest.java
클래스만 수정.
-BookTest.java-
public class BookTest {
public static void main(String[] args) {
// Book[] library = new Book[5];
// for(int i=0; i<library.length; i++) {
// System.out.println(library[i]);
// }
Book[] library = new Book[5];
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
for(Book book : library) {
System.out.println(book);
book.showInfo();
}
}
}
객체를 생성하여 넣었을때는 제대로 데이터가 출력됨.
위 예제에서 Book.java
클래스는 그대로 사용.
-ObjectCopyTest.java-
public class ObjectCopyTest {
public static void main(String[] args) {
Book[] library = new Book[5];
Book[] copyLibrary = new Book[5];
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
System.arraycopy(library, 0, copyLibrary, 0, 5);
library[0].setAuthor("박완서");
library[0].setTitle("나목");
System.out.println("=== library ===");
for(Book book : library) {
System.out.println(book);
book.showInfo();
}
System.out.println("\n=== copyLibrary ===");
for(Book book : copyLibrary) {
System.out.println(book);
book.showInfo();
}
}
}
만약 하나의 배열에만 값을 변경하고싶다면 새로운 객체를 생성한 후 다시 배열에 객체를 넣어야 함.
public class ObjectCopyTest {
public static void main(String[] args) {
Book[] library = new Book[5];
Book[] copyLibrary = new Book[5];
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
copyLibrary[0] = new Book();
copyLibrary[1] = new Book();
copyLibrary[2] = new Book();
copyLibrary[3] = new Book();
copyLibrary[4] = new Book();
// 객체를 새로 생성하여 배열에 객체자체를 새로 입력
for(int i = 0; i<library.length; i++) {
copyLibrary[i].setAuthor(library[i].getAuthor());
copyLibrary[i].setTitle(library[i].getTitle());
}
// arraycopy를 사용해 배열의 주소값만을 복사
// System.arraycopy(library, 0, copyLibrary, 0, 5);
library[0].setAuthor("박완서");
library[0].setTitle("나목");
System.out.println("=== library ===");
for(Book book : library) {
System.out.println(book);
book.showInfo();
}
System.out.println("\n=== copyLibrary ===");
for(Book book : copyLibrary) {
System.out.println(book);
book.showInfo();
}
}
}
int[][] arr = {{1,2,3}, {4,5,6}}
자료형 [][] 배열이름 = new int[행갯수][열갯수]
public class TwoDimensionTest {
public static void main(String[] args) {
int [][] arr = {{1,2,3}, {1,2,3,4}};
int [][] arr2 = new int [3][4];
int i, j;
for(i=0; i<arr.length; i++) {
for(j=0; j<arr[i].length; j++) {
System.out.print(arr[i][j] + ", ");
}
System.out.println("\t" + arr[i].length);
}
System.out.println();
for(i=0; i<arr2.length; i++) {
for(j=0; j<arr2[i].length; j++) {
System.out.print(arr2[i][j] + ", ");
}
System.out.println("\t" + arr2[i].length);
}
}
}
직접 값을 넣어준 배열arr
은 출력했을때 기입된 값이 나오지만
값 없이 크기만 선언한 배열arr2
를 출력하면 값은 모두 0인 3행 4열의 2차원 배열이 출력된다.
boolean add(E e)
: 요소 하나를 배열에 추가함. E는 요소의 자료형을 의미.
int size()
: 배열에 추가된 요소 전체 갯수를 반환
E get(int index)
: 배열의 index 위치에 있는 요소 값을 반환
E remove(int index)
: 배열의 index 위치에 있는 요소값을 제고하고 그 값을 반환
boolean isEmpty()
: 배열이 비어있는지 확인
ch21.Book
클래스를 import하여 사용.
-ArrayListTest.java-
package ch23;
import java.util.ArrayList;
import ch21.Book;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Book> library = new ArrayList<>();
library.add(new Book("태백산맥1" , "조정래")); // 객체를 생성하여 add로 ArrayList에 추가
library.add(new Book("태백산맥2" , "조정래"));
library.add(new Book("태백산맥3" , "조정래"));
library.add(new Book("태백산맥4" , "조정래"));
library.add(new Book("태백산맥5" , "조정래"));
for (int i = 0; i < library.size(); i++) {
library.get(i).showInfo();
}
}
}
F1
을 누르면 java에서 제공되는 메서드에 대한 자세한 영문설명을 볼 수 있음.
좋은 개발자가 되기 위해선 제공하는 도움말 Help를 꼭 살펴보자.
강의보며 따라하는 예제.
나중엔 문제만 보고 풀어보자.
1001학번 Lee와 1002학번 Kim, 두 학생이 있습니다.
Lee 학생은 국어와 수학 2과목을 수강했고, Kim 학생은 국어, 수학, 영어 3 과목을 수강하였습니다.
Lee 학생은 국어 100점, 수학 50점입니다.
Kim 학생은 국어 70점, 수학 85점, 영어 100점입니다.
Student와 Subject 클래스를 만들고 ArrayList를 활용하여 두 학생의 과목 성적과 총점을 출력하세요
-Student.java-
package ch24;
import java.util.ArrayList;
public class Student {
int studentId;
String studentName;
ArrayList<Subject> subjectList;
Student(int studentId, String studentName) {
this.studentId = studentId;
this.studentName = studentName;
subjectList = new ArrayList<>();
}
public void addSubject(String name, int point) {
Subject subject = new Subject();
subject.setName(name);
subject.setScorePoint(point);
subjectList.add(subject);
}
public void showScoreInfo() {
int total = 0;
for(Subject subject : subjectList) {
total += subject.getScorePoint();
System.out.println(studentId + "학생의 " + subject.getName() + "과목의 성적은 " + subject.getScorePoint() + "점 입니다.");
}
System.out.println(studentName + "학생의 총점은 " + total + "점 입니다.");
}
}
-Subject.java-
package ch24;
public class Subject {
private String name;
private int scorePoint;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScorePoint() {
return scorePoint;
}
public void setScorePoint(int scorePoint) {
this.scorePoint = scorePoint;
}
}
-StudentTest.java-
package ch24;
public class StudentSubjectTest {
public static void main(String[] args) {
Student studentLee = new Student(1001, "LEE");
studentLee.addSubject("국어", 100);
studentLee.addSubject("수학", 50);
Student studentKim = new Student(1002, "KIM");
studentKim.addSubject("국어", 70);
studentKim.addSubject("수학", 86);
studentKim.addSubject("영어", 100);
studentLee.showScoreInfo();
System.out.println("\n==========================================\n");
studentKim.showScoreInfo();
}
}
원래는 객체지향, 자바의 데이터형에 대한 선택강의가 더 있지만 기간안에 본강의를 다 들어야 소장권이 나와서 스프링으로 넘어감.
선택강의는 소장권 얻어서 볼 예정. 그래서 꼭 소장권을 따야함.