취업,면접 대비/cs 전공 공부

<객체지향> 인스턴스 맴버, 클래스 맴버, 스태틱 맴버란?

studying develop 2020. 3. 16. 19:41

//인스턴스 맴버라 인스턴스를 생성해줘야 한다.
    public func setCache(){
        DetailCollectionViewCell.self.JpgCache.totalCostLimit = 100
        print("jpgCache size is \(DetailCollectionViewCell.self.JpgCache.totalCostLimit)")
    }
    
    
//이제 스태틱 맴버라 인스턴스를 생성해줘야 한다.
    static public func setCache(){
        DetailCollectionViewCell.self.JpgCache.totalCostLimit = 100
        print("jpgCache size is \(DetailCollectionViewCell.self.JpgCache.totalCostLimit)")
    }

밑에 처럼 바꾸니 위에가 호출이 되었따. 아래는 풀 코드다. 근데 이해가 안되는게 

 

//이 코드가 어떻게 작동될지 이해해야 한다. 다른 셀 객체들이 레퍼런스 클래스를 레퍼런스하는 것이다. 근데 왜
//
class DetailCollectionViewCell: UICollectionViewCell {
    
    @IBOutlet weak var galleryImageView: UIImageView!
    @IBOutlet weak var galleryImageTitleLB: UILabel!
    
    //static let DetailCVCellInstance = DetailCollectionViewCell()
    static let JpgCache = NSCache<NSString,UIImage>()
  
    //인스턴스 맴버라 인스턴스를 생성해줘야 한다.
    static public func setCache(){
        DetailCollectionViewCell.self.JpgCache.totalCostLimit = 100
        print("jpgCache size is \(DetailCollectionViewCell.self.JpgCache.totalCostLimit)")
    }
    
    public func settingDetailCell(imageUrl : String, imageTitle : String){
        //여기서 호출하는게 맞는건가?
//        JpgCache.totalCostLimit = 100
        print("totalCostLimit : \(DetailCollectionViewCell.self.JpgCache.totalCostLimit)")
        
        if let JpgCacheImage = DetailCollectionViewCell.self.JpgCache.object(forKey: imageUrl as NSString){
            self.galleryImageView.image = JpgCacheImage
            print("cache image used")
        }else{
            if let url = URL(string : imageUrl){
                //global의 의미?
                DispatchQueue.global().async {
                    //weak vs unowned?
                    [weak self] in
                    if let data = try? Data(contentsOf: url){
                        if let image = UIImage(data : data){
                            //set to cache
                            DetailCollectionViewCell.JpgCache.setObject(image, forKey: imageUrl as NSString)
                            DispatchQueue.main.async {
                                print("uiImage loaded")
                                self?.galleryImageView.image = image
                            }
                        }else{
                            print("UIImage not found, load")
                        }
                    }
                }
            }//else
        }
        
        /*
        if let myUrl = URL(string: imageUrl)
        {
            galleryImageView.load(url: myUrl)
        }else{
            print("no image in settingDetailCell")
        }
         */
        
        //self를 안붙이면 어떻게 되지??
        self.galleryImageTitleLB.text = imageTitle
    }
    
    
}

 

그런데 이해가 안되는게, 그럼 인스턴스 함수에서는 클래스 내부의 변수를 원래 레퍼런스로 가져오는거 아닌가? 근데 왜 셀을 내려도 같은 값이 출력되지? 변경한 사항이 반영 안되고.

 

이제 좀 이해됬다. 그런데 왜 프리패치하면 캐쉬를 사용안하는지는 모르겠다. 프리 패칭 안에 내용이 잘못된거 같다. 순전히 데이터만 가져오는게 아니라, 셀의 소멸 생성과 관련이 있는거 같기도?? 잘못 코드를 넣어서.


Static Member

 

일단 클래스에서 스태틱에 대한 설명이다. [https://beginnersbook.com/2013/04/java-static-class-block-methods-variables/]

 

Static keyword can be used with class, variable, method and block. Static members belong to the class instead of a specific instance, this means if you make a member static, you can access it without object. Let’s take an example to understand this:

 

스태틱 맴버는 특정 인스턴스가 아니라 클래스에 포함된다, 맴버 변수를 스태틱으로 만든다면, 해당 변수를 객체 없이 접근할수 있다.


Instatnce Member

객체가 생성될때 따라서 생성되는 변수라 생각된다.

 


static vs instance

 

언제 스태틱 메소드를 사용할지 언제 인스턴스 메소드를 사용할지 검색해 봤따.

[https://stackoverflow.com/questions/2671496/java-when-to-use-static-methods]

 

내가 이렇게 하는게 해도 되는가? 이생각을 먼저 해보란다. 맞는 말인듯ㅋㅋ

사람마다 다르겠지만, 이 사람은 어쨋든 그리고 스태틱은 보통 인스턴스 없이 사용하는 경우 자동차라 하면 자동차의 메소드중 마일을 미터로 바꾸는 메소드는 슽틱이 적절하겠지만, 간거리에 따른 사용한 연료는 인스턴스가 있어야 되서 인스턴스 메소드가 적절하단식. 그리고 두개의 자동차중 누가 더 많이 이동했는지 비교하는 메소드 같은것도 굳이 두 인스턴스중 한개의 메소드를 사용하면, 한개가 우선적으로 보이니까 이런 경우도 이 사람은 스태틱으로 한다함. 

 

 

 

 


swift class vs struct 다른 글에서 설명.

'취업,면접 대비 > cs 전공 공부' 카테고리의 다른 글

<운영체제> 시분할 시스템이란  (0) 2020.03.24
<함수 호출과 메모리>  (0) 2020.03.21
<디자인 패턴> MVC vs MVVM 비교 1편  (0) 2020.03.13
<객체 지향> public 과 private  (0) 2020.03.13
RestAPI란?  (0) 2020.03.11